题目描述
新年伊始,我飞瞅准机会要大赚一笔,于是我飞换了一个体积为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;
- }