您的位置:首页 > 其它

poj解题报告——1276

2014-12-27 22:24 190 查看
题意:有现今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]);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: