参看牛客网第一期的 A
PACM
参考 https://blog.csdn.net/qq_36368339/article/details/81227875
(占坑)
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 38
int path[maxn][maxn][maxn][maxn][maxn];
int dp[maxn][maxn][maxn][maxn];
int cnt[maxn][maxn][maxn][maxn];
//int a[]
//记得+1..
int a[maxn]; int b[maxn], c[maxn], d[maxn];
int g[maxn];
int main() {
int n; cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i] >> b[i] >> c[i] >> d[i]>>g[i];
int aa, bb, cc, dd; cin >> aa >> bb >> cc >> dd;
for (int i = 1; i <= n; i++) {
for (int a1 = aa; a1 >= a[i]; a1--) {
for (int b1 = bb; b1 >= b[i]; b1--) {
for (int c1 = cc; c1 >= c[i]; c1--) {
for (int d1 = dd; d1 >= d[i]; d1--) {
//可以不用max吗 可以呀
if (dp[a1][b1][c1][d1] >= dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]] + g[i])
{
//无操作..
path[a1][b1][c1][d1][i] = path[a1][b1][c1][d1][i - 1];
}
else //如果那个大了的话就去更新
{
dp[a1][b1][c1][d1] = dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]] + g[i];
path[a1][b1][c1][d1][i] = i; // path[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]][i - 1]+1;
}
/*
if (dp[a1][b1][c1][d1] == max(dp[a1][b1][c1][d1], dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]] + g[i]))
{
path[a1][b1][c1][d1][i] = path[a1][b1][c1][d1][i - 1];
//如果是0的话,应该不变啊,可是怎么写呢//cnt[a1][b1][c1][d1]
}
//啊不行... 还要记录他上一个是什么... 既然每一个过来都是最佳的
//如果没转移,就别管,如果转移了,就记录他
else {
path[a1][b1][c1][d1][i] = i;
cnt[a1][b1][c1][d1]= dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]]+1;
}
dp[a1][b1][c1][d1] = max(dp[a1][b1][c1][d1], dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]] + g[i]);
*/
}
}
}
}
}
cout << "ans"<<dp[aa][bb][cc][dd]<<endl;
//cout << cnt[aa][bb][cc][dd];
int tmp; int rec=0;
int temp = 0;
temp=path[aa][bb][cc][dd][n];
cout << temp;
for (int i = n; i >=1; i++) {
/*tmp = path[aa][bb][cc][dd][i];
if (tmp = rec)break;
rec = tmp;
cout << tmp << endl;
*/
cout << path[aa][bb][cc][dd][temp];
temp=path[aa][bb][cc][dd][temp];
}
return 0;
}