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]);
}
}
思路:二进制拆分转化为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]);
}
}
相关文章推荐
- poj 1276 多重背包 解题报告
- POJ 1276 解题报告
- POJ 1276 Cash Machine 解题报告
- poj1844解题报告
- poj1258解题报告
- POJ 1002 解题报告 487-3279
- POJ 3468 A Simple Problem with Integers (线段树成段更新) 解题报告
- POJ3650解题报告
- POJ 2719 Faulty Odometer 解题报告
- 解题报告:POJ_3460&HDU_1685 Booksort IDA*
- POJ1247解题报告
- POJ 3281 Dining 最大流解题报告
- 【原】 POJ 1308 Is It A Tree? 并查集树结构 解题报告
- POJ 1789 Truck History 解题报告
- 【原】 POJ 3414 Pots 状态BFS 解题报告
- POJ 3414 解题报告!
- poj2914解题报告
- POJ 2236 解题报告
- poj解题报告——2109
- POJ 2808 校门外的树 解题报告