当前位置:   article > 正文

动态规划-路径记录_动态规划 记录路线

动态规划 记录路线

  

参看牛客网第一期的  A 

PACM

 参考 https://blog.csdn.net/qq_36368339/article/details/81227875

 

(占坑)

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. #define maxn 38
  5. int path[maxn][maxn][maxn][maxn][maxn];
  6. int dp[maxn][maxn][maxn][maxn];
  7. int cnt[maxn][maxn][maxn][maxn];
  8. //int a[]
  9. //记得+1..
  10. int a[maxn]; int b[maxn], c[maxn], d[maxn];
  11. int g[maxn];
  12. int main() {
  13. int n; cin >> n;
  14. for (int i = 1; i <= n; i++)
  15. cin >> a[i] >> b[i] >> c[i] >> d[i]>>g[i];
  16. int aa, bb, cc, dd; cin >> aa >> bb >> cc >> dd;
  17. for (int i = 1; i <= n; i++) {
  18. for (int a1 = aa; a1 >= a[i]; a1--) {
  19. for (int b1 = bb; b1 >= b[i]; b1--) {
  20. for (int c1 = cc; c1 >= c[i]; c1--) {
  21. for (int d1 = dd; d1 >= d[i]; d1--) {
  22. //可以不用max吗 可以呀
  23. if (dp[a1][b1][c1][d1] >= dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]] + g[i])
  24. {
  25. //无操作..
  26. path[a1][b1][c1][d1][i] = path[a1][b1][c1][d1][i - 1];
  27. }
  28. else //如果那个大了的话就去更新
  29. {
  30. dp[a1][b1][c1][d1] = dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]] + g[i];
  31. path[a1][b1][c1][d1][i] = i; // path[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]][i - 1]+1;
  32. }
  33. /*
  34. 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]))
  35. {
  36. path[a1][b1][c1][d1][i] = path[a1][b1][c1][d1][i - 1];
  37. //如果是0的话,应该不变啊,可是怎么写呢//cnt[a1][b1][c1][d1]
  38. }
  39. //啊不行... 还要记录他上一个是什么... 既然每一个过来都是最佳的
  40. //如果没转移,就别管,如果转移了,就记录他
  41. else {
  42. path[a1][b1][c1][d1][i] = i;
  43. cnt[a1][b1][c1][d1]= dp[a1 - a[i]][b1 - b[i]][c1 - c[i]][d1 - d[i]]+1;
  44. }
  45. 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]);
  46. */
  47. }
  48. }
  49. }
  50. }
  51. }
  52. cout << "ans"<<dp[aa][bb][cc][dd]<<endl;
  53. //cout << cnt[aa][bb][cc][dd];
  54. int tmp; int rec=0;
  55. int temp = 0;
  56. temp=path[aa][bb][cc][dd][n];
  57. cout << temp;
  58. for (int i = n; i >=1; i++) {
  59. /*tmp = path[aa][bb][cc][dd][i];
  60. if (tmp = rec)break;
  61. rec = tmp;
  62. cout << tmp << endl;
  63. */
  64. cout << path[aa][bb][cc][dd][temp];
  65. temp=path[aa][bb][cc][dd][temp];
  66. }
  67. return 0;
  68. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/883025
推荐阅读
相关标签
  

闽ICP备14008679号