揹包问题

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章