背包問題的帶記憶功能實(shí)現(xiàn)方法

背包問題的動態(tài)規(guī)劃解決辦法,中,是自底向上實(shí)現(xiàn)的,這樣計(jì)算F[i][j]是可以利用已經(jīng)計(jì)算出的F[i-1][j]或F[i-1][j-W[i]],這樣雖然避免了自頂向下對子問題重復(fù)計(jì)算的問題,但是有一些值是不需要計(jì)算的,帶記憶功能的解決方案是將兩者相結(jié)合,既不用對子問題重復(fù)計(jì)算也不用計(jì)算不需要的值

/*
 *帶有記憶功能的背包問題實(shí)現(xiàn)方法,結(jié)合了自頂向下和自低至上思想
 */
#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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容