我们定义两种价值(下称金钱和精力)。你初始具有0的金钱和w单位的精力。
有n个物品,第i个物品具有一个字符串表示的名字,并可以提供ui
单位的金钱和vi单位的精力(ui,vi都可以是负的,详见数据范围),对于
每个物品你有两种选择:选取或丢弃,且不能选取多次。
你的任务是给出一种选择方案,使得选择结束以后,你拥有的精力非负且
金钱尽可能大。
【输入格式】
第一行两个正整数n,W,含义如题。
接下来n行,第 i 行具有一个字符串si和两个正整数ui,vi,表示一个物品的唯一名字和能提供的两种价值的量。
【输出格式】
第一行一个非负整数,表示最大能获得的金钱的量。
接下来若干行字符串,按照输入顺序输出你选择的每个物品的名字,有多
种方案的话,请输出任意一种。
【样例输入】
4 100
wonder -50 -50
miracle -50 10
dream 100 -55
responsibility 230 -55
【样例输出】
280
miracle
dream
responsibility
【数据范围与约定】
对于前 10% 的数据,v_{i}$$\ge0;
对于前 40% 的数据n$$\le20;
对于另外 40% 的数据,|vi|≤5000;
对于 100 % 的数据,n<= 40, |ui|\le$$10^9, |vi|≤10^9, |si|≤20,W≤1018,字符串由小写字母构成。
当v≥0&&u≥0时直接选取
当v<0&&u<0时直接舍去
接下来应该是动态规划吧() 求核心思路和代码,如下
MyCode
#include<iostream>
#include<algorithm>
using namespace std;
struct thing{
int num;
string name;
long long money,energy;
};
struct define_a_struct_for_ans{
int num;
string name;
};
bool cmp(define_a_struct_for_ans a,define_a_struct_for_ans b){
return a.num>b.num;
}
int main(){
int n,m,num_ans=0,num_project=0,money=0,energy;
thing a[40];
define_a_struct_for_ans ans[40];
cin>>n>>energy;
{
string cin_name;
long long cin_money,cin_energy;
for(int i=0;i<n;i++){
cin>>cin_name>>cin_money>>cin_energy;
if(cin_money>=0&&cin_energy>=0){//若精力和钱都>=0则直接贪掉
ans[num_ans].name=cin_name;
ans[num_ans].num=i;
num_ans++;money+=cin_money;energy+=cin_energy;
}else{
if(!(cin_money<0&&cin_energy<0)){//若精力和钱都<0则直接舍去,否则进入a
a[num_project].name=cin_name;
a[num_project].money=cin_money;
a[num_project].num=i;
a[num_project].energy=cin_energy;
num_project++;
}
}
}
}
//DP
sort(ans,ans+n,cmp);cout<<money<<endl;
for(int i=0;i<num_ans;i++){
cout<<a[i].name;
}
return 0;
}