【貪心演算法】揹包問題 C++
阿新 • • 發佈:2019-01-01
題目
有一個揹包,揹包容量是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;
}