【poj1742】 Coins
http://poj.org/problem?id=1742 (题目链接)
题意
给出n钟纸币,每种纸币面值为a[i],数量为c[i],问能够成多少数值小于等于m的数。
Solution
先想到了容斥,然并卵。又想到了多重背包,这不是经典模型吗。。毫不犹豫二进制分组,结果就TLE了。。于是写了发nm的。。
细节
多组数据清空数组。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | // 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; } |
This passage is made by MashiroSky.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步