题目描述
八(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;
}