1. 程式人生 > >洛谷 P1759 通天之潛水

洛谷 P1759 通天之潛水

題目背景

直達通天路·小A歷險記第三篇

題目描述

在猴王的幫助下,小A終於走出了這篇荒山,卻發現一條波濤洶湧的河攔在了自己的面前。河面上並沒有船,但好在小A有n個潛水工具。由於他還要背重重的揹包,所以他只能背m重的工具,又因為他的力氣並不是無限的,河卻很寬,所以他只能背有v阻力的工具。但是這條河下有非常重要的資料,所以他希望能夠停留的時間最久。於是他找到了你,讓你告訴他方案。

輸入輸出格式

輸入格式:

三個數m,v,n如題目所說

接下來n行,每行三個數ai,bi,ci分別表示所含的重力,阻力,能夠支撐的時間

輸出格式:

第一行一個數,表示最長的時間

接下來一行,若干個數,表示所選的物品

輸入輸出樣例

輸入樣例#1:
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;
}