動態規劃入門 揹包問題

2022-08-21 05:48:12 字數 2092 閱讀 2568

有n個重量和價值分別為wi,vi的物品。從這些物品中選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。在這裡,每個物品只能選一件。

1≤n≤100

1≤wi,vi≤100

1≤w≤10000

n = 4

(w, v) =

w = 5

7(選擇0、1、3號物品)

暴力法(複雜度o(2n))

#include#includeusing namespacestd;

intn;

int w[105], v[105];

int rec(int i, intj) //i為物品序號,j為可用重量

intmain()

上述演算法複雜度太高,於是用了個記憶化陣列,如果在遞迴時該內容已經在之前出現過,直接返回該值

此時複雜度為o(nw)

#include#includeusing namespacestd;

intn;

int w[105], v[105];

int dp[105][105];

int rec(int i, intj)

intmain()

這是用遞迴的方式寫的,再來看一下用迴圈的方式寫的01揹包

複雜度同上

#include#includeusing namespacestd;

intn;

int w[105], v[105];

int dp[105][105];

int rec(intw)

}return 0;

}intmain()

有n種重量和價值分別為wi和vi的物品。從這些物品中挑選總重量不超過w的物品,求出挑選物品價值總和的最大值。在這裡每件物品可以挑選任意多件。

1≤n≤100

1≤wi,vi≤100

1≤w≤10000

n = 3

(w, v) =

w = 7

10(0號物品選1個,2號物品選2個)

由可選任意多件可得下方**

int rec(intw)

}return 0;

}

顯而易見,該**複雜度為o(nw2),並不是最優解

#include#includeusing namespacestd;

intn;

int w[105], v[105];

int dp[105][105];

int rec(intw)

}return 0;

}intmain()

此複雜度為(nw),對比一下可以發現,與01揹包問題**略有相像

此外,01揹包問題和完全揹包問題也可以通過不斷重複利用乙個陣列來實現(小心使用,易出bug)

int rec(intw)

}return 0;

}

int rec(intw)

}return 0;

}

有n個重量和價值分別為wi,vi的物品。從這些物品中選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。在這裡,每個物品只能選一件。

1≤n≤100

1≤wi≤107

1≤vi≤100

1≤w≤109

n = 4

(w, v) =

w = 5

7(選擇0、1、3號物品)

顯而易見,與01揹包問題之1相比,數值變大了,也就不能用o(nw)的演算法了,相對於重量而言,價值的數值比較小,所以嘗試一下改變dp的物件,用dp針對不同價值的最小重量。

**如下

int dp[max_n+1][max_v+1];

int rec(intw)

}int res = 0;

for(i = 0; i <= max_n*max_v; i++)

if(dp[n][i] <=w)

res =i;

printf("%d\n", res);

return 0;

}

動態規劃入門之揹包問題

int value maxlen 前i種物品中取若干種,在總體積不超過j的條件下取得的最大值 int weight 3500 int dvalue 3500 int main i 1時 for int j 1 j m j for int i 2 i n i for int j m j 0 j cou...

動態規劃 入門3 多重揹包問題

分析 這個和我們之前講的0 1揹包問題很像。思路1 我們顯然可以把每種物品的每一件都作為乙個新的物品按照普通0 1揹包的方法做。但是0 1揹包的時間複雜度是o w n 這裡n c1 c2 cn。思路2 換個角度我們用dp i j 表示前i件物品,總重量為j的時候的最大價值。則dp i j max 其...

動態規劃入門 完全揹包(硬幣兌換問題)

在乙個國家僅有1分,2分,3分硬幣,將錢n兌換成硬幣有很多種兌法。請你程式設計序計算出共有多少種兌法。input每行只有乙個正整數n,n小於32768。output對應每個輸入,輸出兌換方法數。sample input 2934 12553sample output718831 13137761 t...