n |
1 |
2 |
3 |
重量 |
10 |
20 |
30 |
價值 |
60 |
100 |
120 |
性價比 |
6 |
5 |
4 |
完整程序:
#include<bits/stdc++.h>
using namespace std;
//計算揹包問題的貪心算法
struct bag{
int w; //物品的重量
int v; //物品的價值
double c; //性價比
}a[1001];
bool cmp(bag a, bag b){
return a.c >= b.c;
}
//形參n是物品的數量,c是揹包的容量M,數組a是按物品的性價比降序排序
double knapsack(int n, bag a[], double c)
{
double cleft= c;//揹包的剩餘容量
int i=0;
double b=0;//獲得的價值
//當揹包還能完全裝入物品i
while(i<n&&a[i].w<cleft)
{
cleft-=a[i].w;
b+=a[i].v;
i++;
}
//裝滿揹包的剩餘空間
if(i<n)b+=1.0*a[i].v*cleft/a[i].w;
return b;//返回獲得的最大價值
}
int main(){
bag a[1001];
cout<<"請輸入揹包的容量"<<endl;
int W;
cin>>W;
cout<<"請輸入物品的數量"<<endl;
int n;
cin>>n;
cout<<"請依次輸入物品的重量和價值"<<endl;
for(int i=0;i<n;i++){
cin>>a[i].w>>a[i].v;
}
for(int i=0;i<n;i++){
a[i].c=1.0*a[i].v/a[i].w;
}
sort(a,a+n,cmp);
cout<<"揹包的最大價值爲:"<<knapsack(n,a,W)<<endl;
}
計算揹包問題的貪心算法,同時得到解向量的完整程序:
#include<bits/stdc++.h>
using namespace std;
//計算揹包問題的貪心算法,同時得到解向量
struct bag{
int w;
int v;
double x; //裝入揹包的量,0≤x≤1
int index; //物品編號
double c;
}a[1001];
bool cmp(bag a, bag b){
return a.c >= b.c;
}
//形參n是物品的數量,c是揹包的容量M,數組a是按物品的性價比降序排序
double knapsack(int n, bag a[], double c)
{
double cleft=c;
int i=0;
double b=0;
while(i<n&&a[i].w<=cleft)
{
cleft-=a[i].w;
b+=a[i].v;
//物品原先的序號是a[i].index,全部裝入揹包
a[a[i].index].x=1.0;
i++;
}
if(i<n){
a[a[i].index].x=1.0*cleft/a[i].w;
b+=a[a[i].index].x*a[i].v;
}
return b;
}
int main(){
bag a[1001];
cout<<"請輸入揹包的容量"<<endl;
int W;
cin>>W;
cout<<"請輸入物品的數量"<<endl;
int n;
cin>>n;
cout<<"請依次輸入物品的重量和價值"<<endl;
for(int i=0;i<n;i++){
cin>>a[i].w>>a[i].v;
}
for(int i=0;i<n;i++){
a[i].c=1.0*a[i].v/a[i].w;
a[i].index=i;
}
sort(a,a+n,cmp);
cout<<"揹包的最大價值爲:"<<knapsack(n,a,W)<<endl;
cout<<"裝入揹包的物品編號以及物品的量依次爲:"<<endl;
for(int i=0;i<n;i++){
cout<<"編號:"<<a[i].index<<"量:"<<a[i].x<<endl;
}
}