题目:http://poj.org/problem?id=1742
贪心地想,1、如果一种面值已经可以被组成,则不再对它更新;
2、对于同一种面值的硬币,尽量用较少硬币(一个)更新,使后面可以用更多此面值硬币。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,a[105],c[105],m,used[100005],ans; bool f[100005]; int main() { while(scanf("%d%d",&n,&m)==2) { if(!n&&!m)return 0; memset(f,0,sizeof f); ans=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]); f[0]=1; for(int i=1;i<=n;i++) { memset(used,0,sizeof used);//!!! for(int j=a[i];j<=m;j++) { if(!f[j]&&f[j-a[i]]&&used[j-a[i]]<c[i]) f[j]=1,used[j]=used[j-a[i]]+1; } } for(int i=1;i<=m;i++) if(f[i])ans++; printf("%d ",ans); } return 0; }