动态规划-路径记录

  

参看牛客网第一期的  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;
}

猜你喜欢

转载自blog.csdn.net/StrongerIrene/article/details/81318248