题目描述
在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前。河面上并没有船,但好在小A有n个潜水工具。由于他还要背重重的背包,所以他只能背m重的工具,又因为他的力气并不是无限的,河却很宽,所以他只能背有v阻力的工具。但是这条河下有非常重要的数据,所以他希望能够停留的时间最久。于是他找到了你,让你告诉他方案。
输入输出格式
输入格式:
三个数m,v,n如题目所说。
接下来n行,每行三个数ai,bi,ci分别表示所含的重力,阻力,能够支撑的时间。
输出格式:
第一行一个数,表示最长的时间。
接下来一行,若干个数,表示所选的物品。
#include <bits/stdc++.h>
using namespace std;
int dp[208][208];
bool pop[105][205][205]={false};//表示第i个物品,在重量为j,阻力为k的情况下选还是不选
void print(int n,int m,int v){ //递归找答案路径
if(n==1){
if(pop[n][m][v]==true)
cout<<1<<' ';
return;
}
if(pop[n][m][v]==true){
print(n-1,m-a[n],v-b[n]);
cout<<n<<' ';
}
if(pop[n][m][v]==false)
print(n-1,m,v);
return;
}
int main(){
int m,v,n;
cin>>m>>v>>n;
for(int i=1;i<205;i++) dp[0][i]=1;
for(int i=1;i<205;i++) dp[i][0]=1;
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
for(int j=m;j>=a;j--)
for(int k=v;k>=b;k--){
dp[j][k]=max(dp[j-a][k-b]+c,dp[j][k]);
pop[n][j][k]=true;
}
}
cout<<dp[m][v];
print(n,m,v);
return 0;
}
总结:如果要记录背包的选择路径,要额外记录使用一个数组记录某状态下的决策。