洛谷 P1759 通天之潛水

題目傳送門

兩維限制的揹包,\(f_{i,j}\)表示重力爲i,阻力爲j的最長時間,和01揹包一樣轉移,最後用一個數組保存一下方案即可

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int m,v,n,a[101],b[101],c[101];
int f[201][201];
string l[201][201];

inline void find_ans(int xx,int yy) {
	for(int i = 0;i < l[xx][yy].length(); i++) {
		int u = l[xx][yy][i];
		printf("%d ",u);
	}
}

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-a[i]][k-b[i]] + c[i] > f[j][k]) {
					f[j][k] = f[j-a[i]][k-b[i]] + c[i];
					l[j][k] = l[j-a[i]][k-b[i]] + (char)i;
				}
	printf("%d\n",f[m][v]);
	find_ans(m,v);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章