1. 程式人生 > >【貪心演算法】揹包問題 C++

【貪心演算法】揹包問題 C++

題目

有一個揹包,揹包容量是M=150。有7個物品,物品可以分割成任意大小。
要求儘可能讓裝入揹包中的物品總價值最大,但不能超過總容量。

物品 A B C D E F G
重量 35 30 60 50 40 10 25
價值 10 40 30 50 35 40 30

思路

使用貪心演算法,每次選擇單位重量價值最高的物品,直至填滿揹包容量。
細節:題中說“物品可以分割成任意大小”,這就意味著揹包容量一定可以全部填滿。

實現

程式碼

#include <iostream>
#include <algorithm> using namespace std; struct bag { int weight;//總重量 int value;//總價值 float bi;//單位重量的價值 float rate;//使用率:1代表完整放入,小於1代表被分割後放入 } bags[50]; bool compare(const bag &bag1,const bag &bag2) { return bag1.bi>bag2.bi; } int main() { int sum=0,n; float M; int
j=0; cout<<"輸入揹包容量和物品數量:"<<endl; cin>>M>>n; for(int i=0; i<n; i++) { cin>>bags[i].weight>>bags[i].value;//錄入物品重量和價值。 bags[i].bi=(float)bags[i].value/bags[i].weight;//計算單位重量價值。 bags[i].rate=0;//初始化每件物品使用率。 } sort(bags,bags+n,compare);//將物品按照單位重量價值由大到小排序
for(j=0; j<n; j++) { if(bags[j].weight<=M) { bags[j].rate=1; sum+=bags[j].weight; M-=bags[j].weight; cout<<"重:"<<bags[j].weight<<"價值:"<<bags[j].value<<"的物品被放入了揹包"<<endl<<"放入比例:"<<bags[j].rate<<endl; } else break; } if(j<n) { bags[j].rate=M/bags[j].weight; sum+=bags[j].rate*bags[j].weight; cout<<"重:"<<bags[j].weight<<"價值:"<<bags[j].value<<"被放入了揹包"<<endl<<"放入比例:"<<bags[j].rate<<endl; } return 0; }

執行結果

這裡寫圖片描述