题意:
给你n个货物有四个属性P,A,C,M并对应value,你拥有四个属性的最大值,让你选出最大的value的编号.
分析:
四维背包好写,这个路径记录很烦人呀。。。
mark一下背包路径记录模板,[属性+1]维path.
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 38;
bool path[MAXN][MAXN][MAXN][MAXN][MAXN];//注意空间,bool类型
int dp[MAXN][MAXN][MAXN][MAXN];
int a[MAXN], b[MAXN], c[MAXN], d[MAXN], val[MAXN];
int vis[1010];
int main() {
int n, a1, a2, a3, a4;
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d %d %d %d %d", &a[i], &b[i], &c[i], &d[i], &val[i]);
}
scanf("%d %d %d %d", &a1, &a2, &a3, &a4);
for(int i = 0; i < n; ++i) {
for(int j = a1; j >= a[i]; --j) {
for(int k = a2; k >= b[i]; --k) {
for(int p = a3; p >= c[i]; --p) {
for(int z = a4; z >= d[i]; --z) {
if(dp[j][k][p][z] <= dp[j - a[i]][k - b[i]][p - c[i]][z - d[i]] + val[i]) {
dp[j][k][p][z] = dp[j - a[i]][k - b[i]][p - c[i]][z - d[i]] + val[i];
path[i][j][k][p][z] = 1;//路径记录
}
}
}
}
}
}
int tot = 0;
int j = a1, k = a2, p = a3, z = a4;
for(int i = n - 1; i >= 0 && j >= 0 && k >= 0 && p >= 0 && z >= 0; --i) {
if(path[i][j][k][p][z] == 1) {
vis[tot++] = i;
j -= a[i];
k -= b[i];
p -= c[i];
z -= d[i];
}
}
printf("%d\n", tot);
for(int i = 0; i < tot; ++i) {
printf("%d\n", vis[i]);
}
return 0;
}