有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...