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;
}
}