题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数
思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的。
代码如下
#include<stdio.h>
#include<string.h>
int dp[110000],num[100100],s[2000][2];
void main()
{
int cash,n,i,j;
while(scanf("%d%d",&cash,&n)>0)
{
int cnt=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
memset(num,0,sizeof(num));
for(j=s[i][1];j<=cash;j++)
if(dp[j]<dp[j-s[i][1]]+s[i][1]&&num[j-s[i][1]]<s[i][0])
{
dp[j]=dp[j-s[i][1]]+s[i][1];
num[j]=num[j-s[i][1]]+1;
}
}
printf("%d\n",dp[cash]);
}
}