遊戲常用演算法 動態規劃演算法 01揹包問題

2021-09-10 08:55:08 字數 2057 閱讀 1162

動態規劃與分治法類似,都是把大問題拆分成小問題,通過尋找大問題與小問題的遞推關係,解決乙個個小問題,最終達到解決原問題的效果。但不同的是,分治法在子問題和子子問題等上被重複計算了很多次,而動態規劃則具有記憶性,通過填寫表把所有已經解決的子問題答案紀錄下來,在新問題裡需要用到的子問題可以直接提取,避免了重複計算,從而節約了時間,所以在問題滿足最優性原理之後,用動態規劃解決問題的核心就在於填表,表填寫完畢,最優解也就找到。

最優性原理是動態規劃的基礎,最優性原理是指「多階段決策過程的最優決策序列具有這樣的性質:不論初始狀態和初始決策如何,對於前面決策所造成的某一狀態而言,其後各階段的決策序列必須構成最優策略」。

題目描述

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

首先要明確這張表是從上到下,從左到右生成的。

01揹包的轉換方程

f[i,j] = max

i表示第幾行,也就是有幾個物品,如上圖灰色列;j表示當前揹包格仔的承重,如上圖藍色標題。

wi指第j件物品的重量,pi指第i件物品的價值

c#**如下

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace bag01

public bagitem(string name, int value)

};//--------------------------------------------揹包問題------------------------------------------

const int maxbagweight = 10;

static string name = ;

static int weight = ;

static int value = ;

static int ncount = weight.length;//物品的總個數

static void calc01package(bagitem[,] itembuffer)

//如果當前承重量大於最後乙個物品的重量,放人最後乙個物品的價值

else

//cout << memory[maxitemcount][curbagweight] << " ";

}//接下來就是動態規劃的體現,對剩下的n-1個物品放入,也就是填充memory陣列

for (int row = 1; row < name.length; ++row)

else}}

}static void main(string args),,

,,,};

calc01package(itembuffer);

console.writeline("揹包價值");

for (int row = 0; row < ncount; ++row)

", itembuffer[row,col].value); //使用printf在這裡比較方便指定行寬

}console.writeline();

}console.writeline("物品放置詳情");

for (int row = 0; row < ncount; ++row)

", ".");

}else

", itembuffer[row, col].name);}}

console.writeline();

}console.readkey();

return;}}}

執行結果

01揹包問題 (動態規劃演算法)

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波 面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...

01揹包問題 (動態規劃演算法)

題目 給定n種物品和乙個容量為v的揹包,物品i的體積是wi,其價值為ci。每種物品只有乙個 問 如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?面對每個物品,我們只有選擇放入或者不放入兩種選擇,每種物品只能放入一次。我們用之前同樣的思路來走一遍試試 假設只剩下最後一件物品,我們有兩種選擇 ...

動態規劃演算法 01揹包問題

動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的...