程序员数据结构和算法分析首页投稿(暂停使用,暂停投稿)

背包问题的带记忆功能实现方法

2017-03-19  本文已影响242人  alonwang

背包问题的动态规划解决办法,中,是自底向上实现的,这样计算F[i][j]是可以利用已经计算出的F[i-1][j]或F[i-1][j-W[i]],这样虽然避免了自顶向下对子问题重复计算的问题,但是有一些值是不需要计算的,带记忆功能的解决方案是将两者相结合,既不用对子问题重复计算也不用计算不需要的值

/*
 *带有记忆功能的背包问题实现方法,结合了自顶向下和自低至上思想
 */
#include <iostream>
using namespace std;
//方便起见这里直接用定值了
int Weights[5]={0,2,1,3,2};
int Values[5]={0,12,10,20,15};
int F[5][6];
int MFKnapsack(int i,int j)
{
    if(F[i][j]<0)
    {
        int value=0;
        if(j<Weights[i])
            value=MFKnapsack(i-1,j);
        else
            value=max(MFKnapsack(i-1,j),Values[i]+MFKnapsack(i-1,j-Weights[i]));
        F[i][j]=value;
    }
    return F[i][j];
}
int main()
{
    for(int i=1;i<5;i++)
        for(int j=1;j<6;j++)
            F[i][j]=-1;

    cout<<MFKnapsack(4,5);
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读