2023年我们cpa协会又增加了新的成员,为了让学弟学妹们知道我们协会的财力,于是会长申请了一笔资金M,带大家去一个或者多个景点玩^_^,为了让大家玩得开心,贴心的会长亲自去了N个景点实地考察,记录了每一个景点大家去玩一共需要的花费V以及对于该景点的满意度S(满分为10),请计算出这一笔资金M能让大家获得的最大满意度之和MaxTotalS。
输入格式:
第一行输入M和N,随后N行依次输入name(该景点的名字),V(去该景点需要的花费),S(该景点的满意度)。
输出格式:
如果大家能出去玩就依次输出大家能去玩的景点名字(按数据输入的顺序从上到下输出),每一个名字后面都跟一个空格,第二行输出这几个景点的满意度之合。
如果哪里都去不了就只输出“insufficient funds.”
。
样例解释:
资金一共10,因此大家可以去:织金洞 ,阿西里西韭菜坪,百里杜鹃。一共花费2+2+5=9,会长对这几个景点的满意度之合9+7+9=25。
输入样例:
10 5
织金洞 2 9
阿西里西韭菜坪 2 7
织金古城 6 7
百里杜鹃 5 9
毕节市人民公园 4 8
输出样例:
织金洞 阿西里西韭菜坪 百里杜鹃
25
题解代码:
// #include<bits/stdc++.h> //二维数组解法
// using namespace std;
// const int MAXN = 1005;
// int v[MAXN]; // 体积
// int w[MAXN]; // 价值
// int f[MAXN][MAXN]; // f[i][j], j体积下前i个物品的最大价值
// string name[MAXN]; //景点名字
// int main()
// {
// int n, m;
// cin >> m >> n;
// queue<string> visit[n+1][MAXN];
// for(int i = 1; i <= n; i++)
// cin>> name[i] >> v[i] >> w[i];
// for(int i = 1; i <= n; i++)
// for(int j = 1; j <= m; j++)
// {
// if(j < v[i]){ // 当前背包容量装不进第i个物品,则价值等于前i-1个物品,且参观的景点集合也为前i-1个。
// f[i][j] = f[i - 1][j];
// visit[i][j]=visit[i-1][j];
// }else{ // 能装,需进行决策是否选择第i个物品
// f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
// if(f[i - 1][j]>f[i - 1][j - v[i]] + w[i]) visit[i][j]=visit[i-1][j]; //参观的景点集合为前i-1个。
// else{
// visit[i][j]=visit[i-1][j-v[i]];
// visit[i][j].push(name[i]);
// }
// }
// }
// if(f[n][m]){
// while(!visit[n][m].empty()){
// cout<<visit[n][m].front()<<' ';
// visit[n][m].pop();
// }
// cout << endl << f[n][m] << endl;
// }else cout<<"insufficient funds.";
// return 0;
// }
#include<bits/stdc++.h> //一维数组解法
using namespace std;
const int MAXN = 1005;
int f[MAXN];
string a[MAXN];
int main()
{
int n, m;
cin >> m >> n;
for(int i = 1; i <= n; i++) {
int v, w;
string k;
cin >> k >> v >> w; // 边输入边处理
for(int j = m; j >= v; j--){
f[j] = max(f[j], f[j - v] + w);
if(f[j]<=f[j-v]+w){ //选第i个物品
a[j]=a[j-v]+k+' ';
}
}
}
if(f[m]){
cout<<a[m]<<endl<<f[m];
}else cout<<"insufficient funds.";
return 0;
}
22软件 张某人