問題:在選擇物品i裝入背包時,可以選擇物品的一部分,而不一定要全部裝入背包。
計算每種物品的單位重量價值作為貪心選擇的依據指標,選擇單位重量價值最高的物品,將盡可能多的該物品裝入背包,依此策略一直地進行下去,直到背包裝滿為止。
在零一背包問題中貪心選擇之所以不能得到最優解原因是貪心選擇無法保證最終能將背包裝滿,部分閑置的背包空間使每公斤背包空間的價值降低了。
#include<iostream> #include<stdio.h>using namespace std; #define N 4 void knapsack(float M,float v[],float w[],float x[]); int main() { float M=50; //預處理:將單位重量價值按照從大到小的順序排好。 //背包所能容納的重量 float w[]={0,10,30,20,5}; //每種物品的重量 float v[]={0,200,400,100,10}; //每種物品的價值 float x[N+1]={0}; //記錄結果的數組 knapsack(M,v,w,x); for(int i=1;i<=N;i++)// cout<<"["<<i<<"]:"<<x[i]<<endl; PRintf("%d=%.2f/n",i,x[i]); } void knapsack(float M,float v[],float w[],float x[]) { int i; //物品整件被裝下 for(i=1;i<=N;i++) { if(w[i]>M) break; x[i]=1; M-=w[i]; } //物品部分被裝下 if(i<=N) x[i]=M/w[i]; }
新聞熱點
疑難解答