题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844
思路:问1-m能的得到的硬币的值,所以dp[i]==i即可。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int dp[100050],a[120],c[120],n,m; void zerof(int cost,int val) { for(int i=m;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+val); } void completf(int cost,int val) { for(int i=cost;i<=m;i++) dp[i]=max(dp[i],dp[i-cost]+val); } void mul(int cost,int val,int num) { if(cost*num>=m) completf(cost,val); else { for(int i=1;i<=num;i*=2) { zerof(i*cost,i*val); num-=i; } zerof(num*cost,num*val); } } int main(void) { int i,j,ans; while(cin>>n>>m&&(n+m)) { memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) cin>>c[i]; for(i=0;i<n;i++) mul(a[i],a[i],c[i]); ans=0; for(i=1;i<=m;i++) ans+=(dp[i]==i?1:0); cout<<ans<<endl; } return 0; }