题目描述
新年伊始,我飞瞅准机会要大赚一笔,于是我飞换了一个体积为V的背包。
现在有N种商品,每种商品有Mi件,可以带来的收益为Pi,体积为Vi。
那么问题来了,在所装物品不超过V的前提下的最大收益是多少?
谁能快速的做帮我飞算出来,我飞就让谁出任UFO,迎娶高富帅,走上人生巅峰233。各位准Final巨巨加油啊。
输入
第一行输入一个T,代表有T(1 <= T <= 15)组数据。
对于每一组数据:
第一行有两个整数N , V。
接下里的N行,每行三个整数Mi,Vi,Pi。
对于所有数据1 <= N <= 200,1 <= V <= 15000,1 <= Mi , Vi, Pi <= 100000。
输出
对于每组数据输出一个整数,代表我飞的最大收益。
示例输入
1
2 10
1 10 10
2 6 21
示例输出
21
提示
来源
zmx
示例程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 30000
long long int dp[N],w[N],p[N],k[N];
int n,V;
int maxx(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
void pack1(int p,int w)
{
int j;
for(j=V;j>=p;j--)
{
dp[j] = maxx(dp[j],dp[j-p]+w);
}
}
void pack2(int p,int w)
{
int j;
for(j=p;j<=V;j++)
{
dp[j] = maxx(dp[j],dp[j-p]+w);
}
}
void pack3(int p,int w,int k)
{
if(p*k>=V)
{
pack2(p,w);
return ;
}
else
{
int kk= 1;
while(kk<=k)
{
pack1(kk*p,kk*w);
k = k - kk;
kk = kk<<1;
}
pack1(k*p,k*w);
}
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&V);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&k[i],&p[i],&w[i]);
}
for(i=1;i<=n;i++)
{
pack3(p[i],w[i],k[i]);
}
printf("%lld\n",dp[V]);
}
return 0;
}
---------------------
作者:叶孤心丶
来源:CSDN
原文:https://blog.csdn.net/yeguxin/article/details/44181109
版权声明:本文为博主原创文章,转载请附上博文链接!