hdu 2844 Coins (多重背包+二进制优化)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844
思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表这个数能凑出来,ans+1;
实现代码:
#include<bits/stdc++.h> using namespace std; const int M = 1e5+10; int lis[M],dp[M],a[M],c[M]; int main() { int n,m,idx; while(cin>>n>>m){ idx = 0; if(n==0&&m==0) break; for(int i = 1;i <= n;i ++) cin>>a[i]; for(int i = 1;i <= n;i ++) cin>>c[i]; for(int i = 1;i <= n;i ++){ int k = 1,p = c[i]; while(p > k){ p -= k; lis[++idx] = a[i]*k; k*=2; } lis[++idx] = a[i]*p; } memset(dp,0,sizeof(dp)); for(int i = 1;i <= idx;i ++){ for(int j = m;j >= lis[i];j --){ dp[j] = max(dp[j],dp[j-lis[i]]+lis[i]); } } int ans = 0; for(int i = 1;i <= m;i ++){ if(dp[i] == i) ans ++; } cout<<ans<<endl; } }