n件物品 揹包最大重量w,
每個物品都有value和w
每個物品都只能取一次,
重量不超過w的情況下
求價值最大。
0[i]
[j] 表示在j的重量下此時,只考慮前i個物品的最大價值
此時倆種情況:
1.不算i物品,此時f[i]
[j]= f[i-1]
[j];即上一行時(不包括第i個物品的最大價值)
2.計算i物品:f[i]
[j]= f[i-1]
[j-w[i]
]+value[i]
;即:將減去i物品的重量時的最大價值+ i物品的價值
將兩種情況對比,取最大的值賦給f[i]
[j]
#include
#include
#include
#include
using
namespace std;
intconst n =
1010
;int f[n]
[n];
// f[i][j] i代表物品,j代表重量,表示在j重量下i個物品所能達到的最大價值
int m,n;
intmain()
}}int res =0;
for(
int i =
1;i<=n;i++
) res=
max(res,f[i]
[m])
; cout<}
此時演算法的時間複雜度為o(n2),一般測試平台每秒執行107次或者108
優化演算法:
將二維陣列變為一維陣列
#include
#include
#include
#include
using
namespace std;
intconst n =
1010
;int f[n]
;// f[i] 表示在i重量下個物品所能達到的最大價值
int m,n;
intmain()
}int res =f[m]
; cout<}
跟0-1揹包不同,此時物體i可以取無限次
/*
f[i] 表示總重量為i的情況下,最大價值多少
在0-1揹包問題下,從大到小排表示在沒有取i的情況下,此時的最大價值就是上乙個物品的最大價值,即i取0次
for(int i =1;i<=n;i++)
for(int j =m;j>=v[i];j--)
f[j]= max(f[j],f[j-v[i]]);
因此完全揹包問題只需要將排序改變就變成了取無數次後的結果,因為這就是取反的效果
result = max(f[0.....m])
for(int i =1;i<=n;i++)
for(int j =v[i]; j<=m;j++)
f[j]= max(f[j],f[j-w[i]]+value[i]);
*/
此時**為:
#include
#include
#include
using
namespace std;
const
int n=
1010
;int f[n]
;int m,n;
int w[n]
,value[n]
;int
main()
cout<<}
動態規劃 揹包問題
給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...
動態規劃 揹包問題
不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...
動態規劃 揹包問題
1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...