1. 程式人生 > >揹包問題-貪心演算法

揹包問題-貪心演算法

1. 揹包問題

給定n種物品和一個揹包。物品i的重量是Wi,其價值為Vi,揹包的容量為C。應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大? (說明,以下演算法與教材147頁給出的演算法思想是一樣的,教材上的演算法事先對物品資訊進行了排序)

 

程式碼如下:

#include "stdafx.h"

#include<stdio.h>

#include<iostream>

using namespace std;

const int num = 20;

void sort(int n,float v[num],float w[num]){

       int i,j;

       float t[num];

       for(i=1;i<=n;i++){

            t[i]=v[i]/w[i];

       }

       for(i=1;i<=n;i++){

              for(j=1;j<=n-i;j++){

                     if(t[j+1]<t[j]){


                            int m=v[j];

                            int n=w[j];

                            int k=t[j];

                            v[j]=v[j+1];

                            w[j]=w[j+1];

                            t[j]=t[j+1];

                            v[j+1]=m;

                            w[j+1]=n;

                            t[j+1]=k;

                     }
              }
       }

       cout<<"------------------------------------------------------------"<<endl;

       cout<<"物品           "<<"重量(w)          "<<"價值(v)       "<<"價值/重量(v/w)"<<endl;

       cout<<"------------------------------------------------------------"<<endl;

              for(i=1;i<=n;i++){

                     cout<<" "<<i<<"        "<<w[i]<<"         "<<v[i]<<"          "<<t[i];

                     cout<<endl;

              }

cout<<"------------------------------------------------------------"<<endl;
}

float Knapsack(int n, float C,float w[num],float v[num],float x[num]){

     int i;

       sort(n,v,w);

       for(i=1;i<=n;i++){

              x[i]=0;

       }

    i=1;

       int total=0;

       while(w[i]<C && i<=n){

         x[i] = 1;

         total = total+v[i];

         C=C-w[i];

         i++;

       }

       if(i<=n){

          x[i]= C/w[i];

          total = total+x[i]*v[i];

       }

       return total;

}

int main(int argc, char* argv[])

{

       int n;

       int i,j;

       float w[num];

       float v[num];

       float x[num];

       int C;

       cout<<"輸入物品個數:";

       cin>>n;

       cout<<"輸入物品重量:"<<endl;

    for(i = 1;i<=n;i++){

              cin>>w[i];

       }

       cout<<"輸入物品價值:"<<endl;

    for(i = 1;i<=n;i++){

              cin>>v[i];

       }

       cout<<"輸入揹包的總重量:";

       cin>>C;

       int total= Knapsack(n,C,w,v,x);

       cout<<"貪心演算法物品選擇為:";

       for(i=1;i<=n;i++){

              cout<<x[i]<<"  ";

       }

       cout<<endl;

       cout<<"物品總價值為:";

       cout<<total;

       cout<<endl;

       return 0;
}

截圖如下: