【poj1742】 Coins
生活随笔
收集整理的這篇文章主要介紹了
【poj1742】 Coins
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://poj.org/problem?id=1742?(題目鏈接)
題意
給出n鐘紙幣,每種紙幣面值為a[i],數(shù)量為c[i],問能夠成多少數(shù)值小于等于m的數(shù)。
Solution
先想到了容斥,然并卵。又想到了多重背包,這不是經(jīng)典模型嗎。。毫不猶豫二進(jìn)制分組,結(jié)果就TLE了。。于是寫了發(fā)nm的。。
細(xì)節(jié)
多組數(shù)據(jù)清空數(shù)組。
代碼
// poj1742 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define inf 2147483640 #define Pi acos(-1.0) #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std;const int maxn=200,maxm=100010; int f[maxm],w[maxm],a[maxn],c[maxn]; int n,m,tot,bin[30];void Divide() {tot=0;for (int i=1;i<=n;i++) {for (int j=0;;j++) {if (bin[j]>c[i]) break;c[i]-=bin[j];w[++tot]=bin[j]*a[i];}if (c[i]) w[++tot]=c[i]*a[i];} } int main() {bin[0]=1;for (int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;while (scanf("%d%d",&n,&m)!=EOF && n && m) {for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<=n;i++) scanf("%d",&c[i]);memset(f,0,sizeof(f));f[0]=1;for (int i=1;i<=n;i++) {memset(w,0,sizeof(w));for (int j=0;j<=m-a[i];j++)if (f[j] && !f[j+a[i]] && w[j]+1<=c[i]) f[j+a[i]]=1,w[j+a[i]]=w[j]+1;}int ans=0;for (int i=1;i<=m;i++) if (f[i]) ans++;printf("%d\n",ans);}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/MashiroSky/p/6222296.html
總結(jié)
以上是生活随笔為你收集整理的【poj1742】 Coins的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java_io_listFile()的应
- 下一篇: 面向对象原型链小结