揹包問題

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

 

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