Description
yzm10再次接到任务,他跟随Molex国王来到了M城的一块风水宝地,这里有许许多多的宝藏等待着挖掘。总共n种宝藏,每种宝藏都给出了体积v,价值w以及数量c,这些宝藏可能是木桶骷髅,也可能是钻石黄金!yzm10于是偷偷地向Molex国王要到了M城最大的麻袋(体积为m),想要带走这些宝藏。但是由于宝藏实在是太多了,所以yzm10想尽可能地带走更多更有价值的宝藏。yzm10同时找来了M城最有经验的黄金矿工,这位矿工可不得了,只要是被他盯上的宝藏,都能够被100%挖掘出来,但是整个过程需要付给矿工一笔不菲的报酬tip,由于yzm10身上没带现金,所以他需要从最终所得宝藏中拿出一部分用来支付报酬。现在就请聪明的你为yzm10设计一个最优策略,使得麻袋中的剩余宝藏价值尽可能的大,并求出这个最大价值,最大价值可能为0。如果宝藏价值连黄金矿工的报酬都支付不了,就输出“GG”(不含引号)。
Input
第一行为n,m,tip。(1<=n、m<=1000,0<=tip<=5000)
第二行到第n+1行为每种宝藏的v,w,c。(1<=v、w<=1000,1<=c<=10)
Output
若yzm10能够付给黄金矿工报酬,输出最大价值,否则打出“GG”(不含引号)。
Sample Input 1
3 10 1
2 3 1
3 8 2
4 5 1
Sample Output 1
20
Sample Input 2
2 10 5000
3 3 1
4 4 1
Sample Output 2
GG
Hint
对于第一个样例,yzm10可以取2个二号物品和1个三号物品,共获得21价值,并支付1价值给矿工,最终得到20价值 。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int v[10001],w[10001],f[10001];
int main(){
int n,m,tip,x,y,z,j,book,cnt=0;
cin>>n>>m>>tip;
book=1;
for(int i=1;i<=n;i++){
scanf("%d %d %d",&x,&y,&z);
cnt+=z;
for(j=book;j<book+z;j++){
v[j]=x;w[j]=y;
}
book=j;
}
//接下来的循环是重点
for(int i=1;i<=cnt;i++){
for(j=m;j>=v[i];j--){
if(f[j]<f[j-v[i]]+w[i]){
f[j]=f[j-v[i]]+w[i];
}
}
}
f[m]-=tip;
if(f[m]<0)
cout<<"GG"<<endl;
else cout<<f[m]<<endl;
return 0;
}