Time Limit: 3000MS |
|
Memory Limit: 30000K |
Total Submissions: 32329 |
|
Accepted: 10993 |
Description
Input
Output
Sample Input
3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0
Sample Output
8
4
题意:有n种硬币,面值为ai的钱币有ci个,问组合的小于等于m的金额有多少种?
教主的男人八题,我果然不是男人/(ㄒoㄒ)/~~膜拜楼教
代码如下:
#include<cstdio> #include<cstring> int a[110],c[110]; int sum[100010];//记录当金额达到当前值时,最多使用这一种硬币的次数 int dp[100010];//dp[i]表示i这种金额是否出现过 int main() { int n,m,i,j,ans; while(scanf("%d%d",&n,&m),n+m) { for(i=0;i<n;++i) scanf("%d",&a[i]); for(i=0;i<n;++i) scanf("%d",&c[i]); memset(dp,0,sizeof(dp)); dp[0]=1; ans=0; for(i=0;i<n;++i) { for(j=0;j<=m;++j) sum[j]=0; for(j=a[i];j<=m;++j)//检查是否会出现前面没有出现过的金额 { //如果j金额没有出现过,j-a[i]金额出现过,且使用第i种硬币没有超过给定数量 if(!dp[j]&&dp[j-a[i]]&&sum[j-a[i]]<c[i]) { dp[j]=1;//标记为已经出现过 sum[j]=sum[j-a[i]]+1;//使用次数加1 ans++;//记录出现的金额数量 } } } printf("%d\n",ans); } return 0; }