參考文章:
對於揹包問題的解答又冒出乙個新的解法,這是一種自頂向下的解法:
設乙個二維陣列select[i][v]表示的是,將前i個物品放入到容量為v的揹包中所能得到的最大價值。如果使用遞迴的演算法
如何使這人問題轉換為多個子問題呢,也就是對這個問題進行不停地分解,直到可以求解為止,然後「歸」,也就是子
問題都求解了,然後將這些子問題拼湊成大問題,因為大問題是依賴於子問題的。
#include
#include
const
intn=3
;//物品個數
const
intw=50
;//揹包的容量
struct
product
;
product
goods[n
+1]=,,,};
//商品資訊
int
select[n
+1][w
+1];
intpktprob
()
for(
inti=1
;i<=n;
i++)
else
}else
}
}
return
select[n
][w];
}
如上**所示,先首新建了乙個select[n+1][w+1]大小的陣列,用於對子問題進行求解。
對每乙個物品進行迴圈,而在選擇這些物品的時候,對揹包的容量進行迴圈,求得在前
i個物品的情況下,所能得到的最大的價值。一定要膽白select[i][v]是前面i個商品在容量
為v的情況下所能獲得的最大的價值,當然有時候並不需要那麼大的容量。
intselect[n+1][w+1];這裡我們可以看到,我們將陣列設為n+1和m+1維的情況,是因為我們把揹包的容量為0和商品數為0時這些特殊情況
考慮進去了。
select[i
][0]=0
;這裡可以看到,這裡初使化為0的根據是當容量為0時,肯定是為0的。
for
(intw=
1;ww++)
#include
"onezeropackage.h"
/*
函式入口引數:
pktvolum:揹包的容量
prtvolum:物品的體積
prtvalue: 物品的價值
prtlen : 物品的個數
測試**:
int prtvalue[4]=;
int prtvolum[4]=;
std::cout<
*/
int
onezeropkt
(int
pktvolum
,int
*prtvolum
,int
*prtvalue
,int
prtlen
)
for(
intw=1
;w<=
pktvolum;w
++)
for(
inti=1
;i<=
prtlen;i
++)else
}else
}
}
return
select
[prtlen
][pktvolum
];
}
來自為知筆記(wiz)
揹包問題 01揹包問題
n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...
01揹包問題 完全揹包問題 多重揹包問題
0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...
01揹包問題 完全揹包問題 多重揹包問題
有n件物品和乙個容量為v 的揹包。放入第i件物品耗費的空間是ci,得到 的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不 放。用子問題定義狀態 即f i,v 表示前i件物品恰放入乙個容量為v的揹包可以 獲得的最大價值。則其狀態轉移方...