题目链接:http://poj.org/problem?id=1742
题意:有n种面值的硬币,面值为A的硬币有C个,现在问利用这n种硬币能够组合,使得总价值小于m的方法有多少种。
代码:
#include<stdio.h>
#include<string.h>
#define MAXN 101
#define MAXM 100001
int A[MAXN],C[MAXN];
int dp[MAXN],num[MAXN];
int main()
{
int i,j,k;
int n,m,ans;
while(scanf("%d%d",&n,&m) && (n!=0 && m!=0))
{
for(i=1;i<=n;i++)
scanf("%d",A+i);
for(i=1;i<=n;i++)
scanf("%d",C+i);
for(i=1;i<=m;i++)
dp[i]=0;
dp[0]=1;
ans = 0;
for(i=1;i<=n;i++)
{
for(k=0;k<=m;k++)
num[k] = 0;
for(j=A[i];j<=m;j++)
{
if(!dp[j] && dp[j-A[i]] && num[j-A[i]] < C[i])
{
dp[j] = 1;
ans++;
num[j]=num[j-A[i]]+1;
}
}
}
printf("%d\n",ans);
}
return 0;
}