#include<iostream>
using namespace std;
int N,V,dp[105];
int max(int a,int b)
{
return a > b ? a : b;
}
void ZeroOnePack(int weight,int value)
{
for(int v = V;v >= weight;v--)
dp[v] = max(dp[v],dp[v-weight]+value);
}
void CompletePack(int weight,int value)
{
for(int v = weight;v <= V;v++)
dp[v] = max(dp[v],dp[v-weight]+value);
}
void MultiplePack(int weight,int value,int count)
{
if(weight*count >= V) //如果次数和重量的积大于V,就类似于完全背包,因为完全背包可以取无数次,乘积必然大于V
{
CompletePack(weight,value);
}
else //否则的话二进制转换为01背包
{
int k = 1;
while(k < count)
{
ZeroOnePack(k*weight,k*value);
count = count - k;
k = k*2;
}
ZeroOnePack(count*weight,count*value);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&V,&N);
int i,p,h,c;
for(i = 1;i <= N;i++)
{
scanf("%d %d %d",&p,&h,&c);
MultiplePack(p,h,c);
}
printf("%d\n",dp[V]);
}
return 0;
}
hdu 2191 多重背包
最新推荐文章于 2011-08-27 18:28:14 发布