You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
Input The input contains several test cases. The first line of each test case contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1 ≤ Ai ≤ 100000,1 ≤ Ci ≤ 1000). The last test case is followed by two zeros.
Output For each test case output the answer on a single line.
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
Sample Output
8 4
Source 2009 Multi-University Training Contest 3 - Host by WHU
思路:经典背包问题。
#include#include using namespace std; int d[105],c[105],dp[100005]; int main() { int n,m,i,j,k,ans; while(~scanf("%d%d",&n,&m) && n+m) { for(i=0;i =m) { for(j=d[i];j<=m;j++) dp[j]=max(dp[j],dp[j-d[i]]+d[i]); } else { k=1; while(((k<<1)-1)<=c[i]) { for(j=m;j>=k*d[i];j--) dp[j]=max(dp[j],dp[j-k*d[i]]+k*d[i]); k<<=1; } if(k-1 =k;j--) dp[j]=max(dp[j],dp[j-k]+k); } } } ans=0; for(i=1;i<=m;i++) if(dp[i]==i) ans++; printf("%d\n",ans); } }