您的位置:首页 > 其它

hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

2013-06-16 23:34 316 查看
解题思路:多重背包

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

#define clr(p,v) memset(p,v,sizeof(p))
const int maxn = 100010 ;

int n, m, C;
int d[110];

void zeroOnePack(int cost, int weight)
{
for (int i=m; i>=cost; --i)
d[i] = max(d[i], d[i-cost]+weight);
}

void completePack(int cost, int weight)
{
for (int i=cost; i<=m; ++i)
d[i] = max(d[i], d[i-cost]+weight);
}

void multiPack(int cost, int weight, int amount)
{
if (cost*amount >= m)
completePack(cost, weight);
else
{
int num = 1;
while (num <= amount)
{
zeroOnePack(num*cost, num*weight);
amount -= num;
num <<= 1;
}
zeroOnePack(amount*cost, amount*weight);
}
}

int main()
{
scanf("%d", &C);
while (C--)
{
//Input && Calculate
clr(d, 0);
scanf("%d%d", &m, &n);
for (int i=1; i<=n; ++i)
{
int p, w, c;
scanf("%d%d%d", &p, &w, &c);
multiPack(p, w, c);
}
//output
printf("%d\n", d[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐