动态规划救助
  • 板块学术版
  • 楼主_8008008
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/10 19:17
  • 上次更新2023/11/3 10:41:25
查看原帖
动态规划救助
803885
_8008008楼主2023/7/10 19:17

我们定义两种价值(下称金钱和精力)。你初始具有0的金钱和w单位的精力。
有n个物品,第i个物品具有一个字符串表示的名字,并可以提供uiu_{i}
单位的金钱和viv_{i}单位的精力(uiu_{i},viv_{i}都可以是负的,详见数据范围),对于 每个物品你有两种选择:选取或丢弃,且不能选取多次。 你的任务是给出一种选择方案,使得选择结束以后,你拥有的精力非负且 金钱尽可能大。
【输入格式】
第一行两个正整数nn,WW,含义如题。
接下来nn行,第 i 行具有一个字符串sis_{i}和两个正整数uiu_{i},viv_{i},表示一个物品的唯一名字和能提供的两种价值的量。
【输出格式】
第一行一个非负整数,表示最大能获得的金钱的量。
接下来若干行字符串,按照输入顺序输出你选择的每个物品的名字,有多
种方案的话,请输出任意一种。
【样例输入】

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% 的数据,|viv_{i}|≤\le5000;
对于 100 % 的数据,n<= 40, |uiu_{i}|\le$$10^9, |viv_{i}|≤\le10^9, |sis_{i}|≤\le20,W≤\le1018,字符串由小写字母构成。
当v≥\ge0&&u≥\ge0时直接选取
当v<<0&&u<<0时直接舍去
接下来应该是动态规划吧() 求核心思路和代码,如下
MyCodeMy Code

#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;
}
2023/7/10 19:17
加载中...