揹包問題-貪心演算法
阿新 • • 發佈:2019-01-05
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; }
截圖如下: