算法试卷第五题,看了下,根据题意对答案进行了一下扩展,用C++把算法写了下。哎,不早了,该睡觉了。
题目:
5、(0-1背包问题)现有五个物品,其中(w1,w2,w3,w4,w5=(3,4,7,8,9),(v1,v2,v3,v4,v5)=(4,5,10,11,13),W=17.(wi表示物品重量,vi表示物品价值,W表示背包所能承受的总重量)。求背包能获得最大价值的装法
1
#include <stdio.h>
2
#include <vector>
3
#include <iostream.h>
4
using namespace std;
5
int knapsack(vector<double> w, vector<double> v,int W)
6

{
7
int i=w.size();
8
double *arg=new double[i]; //物品的单位重量价值
9
//算出各物品的单位重量价值
10
for(int j=0;j<i;j++)
{
11
arg[j]=v[j]/w[j];
12
}
13
int *rank=new int[i];
14
for(int k=0;k<i;k++)
{//赋初始值,顺序与物品下标相同
15
rank[k]=k;
16
}
17
18
for(int m=0;m<i;m++)
{
19
20
for(int n=m;n<i;n++)
{
21
if(arg[m]<arg[n])
{
22
double t;
23
//转换值
24
t=arg[m];
25
arg[m]=arg[n];
26
arg[n]=t;
27
//转换下标
28
int temp1=rank[m];
29
int temp2=rank[n];
30
rank[m]=temp2;
31
rank[n]=temp1;
32
}
33
}
34
}
35
int *x=new int[i];//存放各物品放在包里的数量x[1]则为第二件物品放在包里的数量
36
for(int z=0;z<i;z++)
{
37
if(W/w[rank[z]]==0)continue;//判断是否能翻进去 为0则说明当前物品超重
38
x[rank[z]]=W/w[rank[z]];//计算可以存放的物品数量
39
W=W-(W/w[rank[z]])*w[rank[z]];
40
}
41
cout<<"[";
42
for(int y=0;y<i;y++)
{
43
cout <<"x"<<y+1;
44
if(y+1!=i)cout <<",";
45
}
46
cout <<"]=";
47
cout <<"[";
48
for(y=0;y<i;y++)
{
49
cout <<x[y];
50
if(y+1!=i)cout <<",";
51
}
52
cout <<"]";
53
delete rank;
54
delete x;
55
delete arg;
56
return 0;
57
}
58