终于,花了几天的时间,小明逛完了奇奇怪怪的城市B,今天是旅游的最后一天了,爸爸决定带着小明来游泳馆放松一下。这个时候正巧游泳馆在举行潜水比赛,于是爸爸又改变了主意,觉得小明还可以锻炼一下。潜水比赛的规则如下:
游泳馆共有n个潜水工具,每个潜水工具具有一定的重量和阻力以及固定的停留时间,小明弱不经风的身体只能背着重量最多为m的工具,以及承受阻力最多为v的工具(阻力太大会被水冲跑),谁在原地停留的时间最长谁就能取得最终的胜利。请你计算一下小明最长能在水底停留多久以及选择的工具分别是哪些。
输入描述
第一行为三个数 m,v,n 如题目所说。
接下来 n 行,每行三个数 a
i
,b
i
,c
i
分别表示第i个工具所含的重力,阻力,能够支撑的时间。
输出描述
第一行一个数,表示最长的时间。
接下来一行,若干个数,表示所选的物品。
用例输入 1
100 100 3
50 60 289
40 10 116
50 50 106
用例输出 1
405
1 2
提示
对于 100% 的数据,1≤m,v≤200,1≤n≤100。
数据保证一定有方案。
若有多种方案,输出前面尽量小的方案。
直接上代码:
#include <bits/stdc++.h>
using namespace std;
long long n,m,v,f[1005][1005];
string ans[1005][1005];
struct node {
long long a,b,c;
} a[1005];
int main() {
cin>>m>>v>>n;
for(int i=1; i<=n; i++) cin>>a[i].a>>a[i].b>>a[i].c;
for(int i=1; i<=n; i++)
for(int j=m; j>=a[i].a; j--)
for(int k=v; k>=a[i].b; k--) {
if(f[j-a[i].a][k-a[i].b]+a[i].c>f[j][k] || f[j-a[i].a][k-a[i].b]+a[i].c==f[j][k] && ans[j-a[i].a][k-a[i].b]+char(i)<ans[j][k]){
f[j][k]=f[j-a[i].a][k-a[i].b]+a[i].c;
ans[j][k]=ans[j-a[i].a][k-a[i].b]+char(i);
}
}
cout<<f[m][v]<<"\n";
for(int i=0; i<ans[m][v].size(); i++)
cout<<int(ans[m][v][i])<<" ";
return 0;
}