給定 n 個物品和乙個容量為c的揹包,物品 i 的重量是w,其價值是v,揹包問題是如何選擇裝入揹包的物品使得裝入揹包中的物品總價值最大。
與0/1揹包問題的區別:在部分揹包問題中物品可以部分裝入,但不能重複裝入揹包
使用貪心演算法解決該問題的關鍵是如何確定貪心策略。
舉例一下幾種貪心策略(根據如何選出最大的總價值)
1、選擇價值最大的物品
證明反例: c = 30
w = 28 10 10
v = 30 20 20
這時選擇後兩個組合總價值較高
2、選擇重量最輕的物品
證明反例: c = 30
w = 5 10 20
v = 1 2 20
這時如果按照重量最輕的選擇總價值不如只選擇最後乙個
3、選擇價效比最高的物品
證明因為每次加入的都是現有物品種價效比最高的物品,所以這時按照價效比(價值 / 重量)最高進行選擇可以獲得到整體最優解。
1、對物品進行按價效比進行降序排序(選擇乙個最好的排序演算法)。時間複雜度:o(nlog2n)
2、依次將物品裝入揹包中。 時間複雜度:o(n)
總的時間複雜度:o(nlog2n)
假如有三個物品,其中重量分別是,價值分別為 ,揹包的容量為50,求最大總價值
#include
#include
using
namespace std;
//快速排序
intpartition
(int w,
int v,
double num,
int i,
int j)
while
(i < j && num[i]
> num[j]
) j--;if
(i < j)
}return i;
}void
quick_sort
(int w,
int v,
double num,
int i,
int j)
}//部分揹包問題核心部分
intknapsack
(int w,
int v,
double num,
int c)
//此時揹包已經不能完整裝入乙個物品
//將剩餘的容量 * 下個物品的價效比
sum = sum +
(c * num[i]);
return sum;
}int
main
(int argc,
char
** ar**)
;int v[3]
=;double num[3]
=;int c =50;
int temp =0;
int j =0;
//使用貪心策略對資料進行排序
for(
int i =
0; i <
3; i++
)//使用快速排序對資料排序
quick_sort
(w,v,num,0,
2); cout <<
knapsack
(w,v,num,c)
;system
("pause");
return0;
}
部分揹包問題
描述給定乙個最大容量為m公斤的揹包和n種食品,有食鹽白糖大公尺等。已知第i種食品價值為每公斤vi元 有wi公斤,程式設計確定乙個方案 使揹包中食品總價值最大 輸入 輸入m,n n種食品的vi,wi 1 m n 1000 1 wi,vi 1000 輸出 揹包的最大價值 樣例輸入1 複製3 3 10 3...
部分揹包問題
uog up 2240 luogu p2240 luogup 2240 阿里巴巴走進了裝滿寶藏的藏寶洞。藏寶洞裡面有 n n 100 n n le 100 n n 10 0 堆金幣,第 i ii 堆金幣的總重量和總價值分別是 mi,vi 1 mi,vi 100 m i,v i 1 le m i,v ...
揹包問題(1)部分揹包
1.現有4個揹包,已知每個物品的體積和價值,每個揹包最多容納10個體積的物品,每件物品只能拿一次,問怎麼樣裝使揹包的價值最大?分析 1 二維陣列求法 如果包的體積由0變化到10,每次物品只能放一次,則包內所放物品的價值量為 則包所放的最大價值即二維陣列的最後乙個值 如下 include using ...