题目传送门
两维限制的背包,(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
",f[m][v]);
find_ans(m,v);
return 0;
}