Re0:DP学习之路 01背包如何打印路径?

Posted baccano-acmer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Re0:DP学习之路 01背包如何打印路径?相关的知识,希望对你有一定的参考价值。

伪代码

用二维数组记录,如果出现可以转移的dp那么记录bk[当前体积][装的物品]=1

输出的时候倒推,如果存在连通的边那么输出并且总共的体积减去输出的体积

代码(uva-624,目前wa不明所以,网上的答案也是那么输出的,或许要输出最多的物品?目前也不会这种玩法)

#include <bits/stdc++.h>
using namespace std;
int v[1000],dp[1000000],bk[1000][1000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,m;
  while(cin>>m>>n)
  {
    memset(dp,0,sizeof(dp));
    memset(bk,0,sizeof(bk));
    stack<int> st;
    for(int i=1;i<=n;i++)
    cin>>v[i];
    for(int i=1;i<=n;i++)
    for(int j=m;j>=v[i];j--)
    if(dp[j]<dp[j-v[i]]+v[i])
    {
      bk[j][i]=1;
      dp[j]=dp[j-v[i]]+v[i];
    }
    for(int i=n,j=m;i>=1;i--)
    if(bk[j][i])
    st.push(v[i]),j-=v[i];
    while(st.size())
    {
      cout<<st.top()<<" ";
      st.pop();
    }
    cout<<"sum:"<<dp[m]<<"
";
  }
}

以上是关于Re0:DP学习之路 01背包如何打印路径?的主要内容,如果未能解决你的问题,请参考以下文章

DP学习之路--01背包

POJ 1015 / UVA 323 Jury Compromise(01背包,打印路径)

uva 624 CD 01背包打印路径

UVA624(01背包记录路径)

左神算法第八节课:介绍递归和动态规划(汉诺塔问题;打印字符串的全部子序列含空;打印字符串的全排列,无重复排列;母牛数量;递归栈;数组的最小路径和;数组累加和问题,一定条件下最大值问题(01背包))

[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map(代码片