站外题求助
  • 板块学术版
  • 楼主Chalage_2010
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/3/24 20:19
  • 上次更新2023/10/23 20:40:38
查看原帖
站外题求助
760690
Chalage_2010楼主2023/3/24 20:19

题目描述

八(1)班由于在期中考中获得了团体第一名,班主任吴老师决定开一场庆功会。于是购买东西的任务就交给了小李同学(钱由班会出)。由于小李同学四肢发达,头脑简单,于是这个任务便落到了你头上(当然不要你跑腿。跑腿是小李的事 ^_^)
注:可以全买,但不能不买。即至少买1种

 

输入格式:
第一行二个数n(n<=500),m(m<=5000),其中n代表希望购买的物品的种数,m表示班会拨给小李的钱数。
接下来n行,每行3个数,v、w、s,分别表示第I种物品的价格、价值(价格 与 价值 是不同的概念)和购买数量(只能买0件或s件),其中v<=100,w<=1000,s<=10

 

输出格式:
共两行:
第一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。
第二行:小李此次购买(能获得的最大价值)所选择的物品种类的序号

 

样例输入:
5 1000
80 20 4
40 50 9
30 50 7
40 30 6
20 20 1
 

样例输出:
1000
2 3 4 5
 

数据范围:
见题目

 

时间限制:
1000

 

空间限制:
65536

我的代码

#include<bits/stdc++.h>
using namespace std;
int n,m,c[5005],w[5005],s[5005],dp[5005][5005],f[5005],x;
int main(){
	cin>>n>>m;
	for(int i=1;i <= n;i++){
		cin>>w[i]>>c[i]>>s[i];
	}
	for(int i=1;i <= n;i++){
		for(int j=1;j <= m;j++){
			if(j >= w[i]*s[i]){
				dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]*s[i]]+c[i]*s[i]);
			}
			else{
				dp[i][j] = dp[i-1][j];
			}
		}
	}
	x = m;
	for(int i=n;i >= 1;i--){
		if(dp[i-1] != dp[i]){
		f[i]=1;
		x = x-w[i];
		}
	}
	cout<<dp[n][m];
	cout<<endl;
	for(int i=2;i <= n;i++){
		if(f[i] == 1){
			cout<<i<<" "; 
			x -= w[i];
			f[i] = 0;
		}
	}
	return 0;
} 
2023/3/24 20:19
加载中...