有n個物品 ,但物品不僅僅只有重量w ,還有價值v,揹包的重量上限還是c ,
要使放進揹包的物品的重量不超過c的情況下價值總和最大
。【注】物品可以拿一部分並且這部分的重量和價值就按照比例計算。
首先,目標要求價值總和最大,我們很容易想到每次先拿價值最大的。但這樣沒有考慮到揹包的重量這個條件。又因為物品可以按比例取,我們不難想到按照每個物品的「單位重量所含的價值==
然後,我們就按照順序將單位重量下價值更高的物品整體全部拿走,
直到,後來我們的揹包所剩餘的容量已經不足以放下整個物品了, 那我們就把這最後乙個物品拆分只拿走部分,這樣我們就填滿了揹包
(可以注意到此題只要物品總和比揹包容量大,揹包總是可以被填滿)。
#include#include#define n 100
using namespace std;
struct node;
bool cmp(const node &a,const node &b)
int main()
for(int i=0;i>a[i].v;
a[i].cp=(double)a[i].v/a[i].w;
} sort(a,a+n,cmp); //將所有物品按單位重量的價值遞減排序
int number;//number用於統計揹包裡的物品總個數
double sum=0; //sum用於統計揹包裡的物品總價值。
for(int i=0;i=0){ //判斷揹包是否還裝的下當前物品
揹包問題(1)部分揹包
1.現有4個揹包,已知每個物品的體積和價值,每個揹包最多容納10個體積的物品,每件物品只能拿一次,問怎麼樣裝使揹包的價值最大?分析 1 二維陣列求法 如果包的體積由0變化到10,每次物品只能放一次,則包內所放物品的價值量為 則包所放的最大價值即二維陣列的最後乙個值 如下 include using ...
貪心演算法 0 1部分揹包問題
給定n種物品和乙個揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大 選擇物品i裝入揹包時,可以選擇物品i的一部分,而不一定要全部裝入揹包,1 i n。因為每乙個物品都可以分割成單位塊,單位塊的利益越大顯然總收益越大,所以它區域性最優滿足...
洛谷P2240 部分揹包問題 貪心
洛谷p2240 樣例 輸入 450 1060 20100 30120 1545 輸出 240.00 思路 與動態規劃的揹包問題不同,此處的金幣是可以隨意分割的,我們可以運用貪心,優先選取最合適的金幣堆。怎麼優先選擇呢?題中說道 分割完的金幣重量價值比 也就是單位 不變 所以可以優先選擇單位 大的金幣...