标签:
http://poj.org/problem?id=1742
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
题意:给定价值为Ai的硬币个数为Ci个,用这些硬币进行组合,能组成在m之内的数的个数。
这个是动态规划,但是我第一感觉这是一个母函数的..后来想想只是母函数的话,复杂度就过高了
然后我们可以用dp来记录更新dp[i]是否可以可以组合得到i,能的话,就加1,枚举j<=m,sum[]记录的是由价值为Ai的硬币数得到价值为j用的个数,具体做就是sum[j]=sum[j-Ai]+1;
#include <stdio.h>
#include <algorithm>
#include <string.h>
int dp[100005];//dp表示的是价值为j的可以得到与否
int sum[100005];//sum[j]=sum[j-val]+1;得到价值为j的用了价值为val的多少个
int val[105],cal[105];
int main()
{
int i,j,k,n,m;
while(scanf("%d%d",&n,&m)&&n|m)
{
for(i = 1;i<=n;i++)
scanf("%d",&val[i]);
for(i = 1;i<=n;i++)
scanf("%d",&cal[i]);
memset(dp,0,sizeof(dp));
dp[0] = 1;
int ans = 0;
for(i=1;i<=n;i++)
{
memset(sum,0,sizeof(sum));
for(j = val[i];j<=m;j++)//j每次从val[i]开始
{
if(!dp[j] && dp[j-val[i]] && sum[j-val[i]]<cal[i])
{
dp[j] = 1;
sum[j] = sum[j-val[i]]+1;
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/osiris53719/p/4455093.html