0 1揹包問題,回溯實現

2022-09-05 11:03:15 字數 979 閱讀 5850

0-1揹包:問題描述,noip 2001 裝箱問題

有乙個箱子容量為

v(正整數,0<=

v<=20000

),同時有

n個物品(0<

n<=30,每個物品有乙個體積(正整數)。要求n

個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。

動態規劃考慮:容量為v的箱子,最多能裝多少單位體積的物品vmax,v-vmax即為

剩下最少的體積。

s[v]表示容積為v的箱子,最多能裝的物品體積

則對當前的物品m,動態轉移方程:

s[v]=max

實現:

for(i=0;i=w[i];j--)

if(s[j-w[i]]+w[i]>s[j])

s[j]=s[j-w[i]]+w[i];

}

深度搜尋考慮:

深度搜尋:以乙個點為起點,向下搜尋,直到末尾節點為止。但是要注意,搜尋中節點回溯(即某個節點,在搜尋的過程中,可以新增,也可以不新增的情況處理)

#include #include /*

有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30,

每個物品有乙個體積(正整數)。

要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。

這是乙個典型的0—1揹包型問題,可以採用搜尋(深搜)、動態規劃等方法

深度搜尋:以乙個點為起點,向下搜尋,直到末尾節點為止。但是要注意,搜尋中節點回溯

(即某個節點,在搜尋的過程中,可以新增,也可以不新增的情況處理)

*/int v,n,w[31],min;

int dfs(int k,int v) //深度搜尋

{ if(k>=n||v<=0) return 0; //搜尋結束的情況

int i,j;

for(i=k;i=0) //該節點在限制範圍內可以新增

{ if(v-w[i]

回溯 0 1揹包問題

回溯演算法的要點 1,針對所給問題,定義問題的解空間。2,確定容易搜尋的解空間的組織結構。3,通過剪枝優化搜尋過程。下面通過求解0 1揹包問題來分析使用回溯演算法的過程 1,根據問題的描述,設所有的物件數是n,對應的重量和價值分別為w 0 n 1 和v 0 n 1 於是這個問題就轉化成在這n件物件中...

回溯 01揹包問題

這裡再簡單寫一下問題要求 給定n中物品和乙個容量為c的揹包,物品i的重量為wi,其價值為vi,0 1揹包問題是如何選擇裝入揹包的物品 物品不可分割 使得裝入揹包的物品的價值為最大。1.題目分析 考慮到每種物品只有2 種選擇,即裝入揹包或不裝入揹包,並且物品數和揹包容量已給定,要計算裝入揹包物品的最大...

0 1揹包問題(回溯)

描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入多個測例,每個測例的輸入佔三行。第一行兩個整數 n n 10 和c,第二行n個整數分別是w1到w...