背包问题的算法分析(C++描述)

背包问题的算法分析(C++描述)

    算法试卷第五题,看了下,根据题意对答案进行了一下扩展,用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;
56return 0;
57}

58

你可能感兴趣的:(背包问题的算法分析(C++描述))