洛谷 P1759 通天之潛水
阿新 • • 發佈:2019-01-25
題目背景
直達通天路·小A歷險記第三篇
題目描述
在猴王的幫助下,小A終於走出了這篇荒山,卻發現一條波濤洶湧的河攔在了自己的面前。河面上並沒有船,但好在小A有n個潛水工具。由於他還要背重重的揹包,所以他只能背m重的工具,又因為他的力氣並不是無限的,河卻很寬,所以他只能背有v阻力的工具。但是這條河下有非常重要的資料,所以他希望能夠停留的時間最久。於是他找到了你,讓你告訴他方案。
輸入輸出格式
輸入格式:三個數m,v,n如題目所說
接下來n行,每行三個數ai,bi,ci分別表示所含的重力,阻力,能夠支撐的時間
輸出格式:第一行一個數,表示最長的時間
接下來一行,若干個數,表示所選的物品
輸入輸出樣例
100 100 3 50 60 289 40 10 116 50 50 106輸出樣例#1:
405 1 2
說明
1<=m,v<=200,n<=100
資料保證一定有方案。
若有多種方案,輸出前面儘量小的方案。
二維費用揹包,但是要輸出方案。。。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N=105; int m,v,n,a[N],b[N],c[N],f[205][205],w[205][205][N]; int main() { scanf("%d%d%d",&m,&v,&n); for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]); for(int i=1;i<=n;i++) for(int j=m;j>=a[i];j--) for(int k=v;k>=b[i];k--) if(f[j][k]<f[j-a[i]][k-b[i]]+c[i]) { f[j][k]=f[j-a[i]][k-b[i]]+c[i]; memcpy(w[j][k],w[j-a[i]][k-b[i]],sizeof(w[j][k])); w[j][k][++w[j][k][0]]=i; } printf("%d\n",f[m][v]); for(int i=1;i<=w[m][v][0];i++) printf("%d ",w[m][v][i]); printf("\n"); return 0; }