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.
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
84
题意:给你货币的种数n,能花的最大金额不超过的数m,然后给你各个币种的面值,和个数,问你能组成的金额有多少种。
思路:把所有金额一开始都赋值为-1,dp数组里存的都是这个金额剩余的个数,如果是-1 这个金额用已有的钱组不成
讲解一下第一个样例:
1~m dp[j] 0 1 2 3 4 5 6 7 8 9 10
a[i]=0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
a[i]=1 2 1 0 -1 -1 -1 -1 -1 -1 -1 -1 组成j时1剩余的个数
a[i]=2 1 1 1 0 0 -1 -1 -1 -1 -1 -1 组成j2时剩余的个数
a[i=4] 1 1 1 1 1 0 0 0 0 -1 -1 组成j4时剩余的个数
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[100005]; int a[105],c[105]; int m,n; int main() { int i,j; while(scanf("%d%d",&n,&m) && m+n) { for(i=1; i<=n; i++) scanf("%d",&a[i]); for(i=1; i<=n; i++) scanf("%d",&c[i]); memset(dp,-1,sizeof(dp)); dp[0]=0; for(i = 1; i <= n; i++) { for(j = 0; j <= m; j++) { if(dp[j]>=0)//上一个金额还没用完 { dp[j]=c[i]; } else if(j < a[i] || dp[j-a[i]]<=0){//上一个金额用完了 dp[j]=-1; } else { dp[j] = dp[j-a[i]]-1; } } } int sum=0; for(i=1; i<=m; i++) { if(dp[i]!=-1) sum++; } cout<<sum<<endl; } }