回溯法-經典 01揹包問題
阿新 • • 發佈:2019-01-10
經典問題:
給定N中物品和一個揹包。物品i的重量是Wi,其價值位Vi ,揹包的容量為C。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大??
分析
1、如上圖碰到一組資料,有兩種可能:選或者不選,在樹種分別由1,0表示。
2、使用遞迴,在遍歷完n個數的時候,判斷最終的數是否比最佳價值大,如果比最佳價值大,就把值賦給bestv。
程式碼:
#include<stdio.h>
int c=30; //揹包容量
int n=3; //物件數目
int w[]={20,15,15}; //物件重量陣列
int v[]={40,25,25}; //物件收益陣列
int cw; //當前揹包重量
int cv; //當前揹包價值
int bestv;//迄今最大的收益
int X[n]; //記錄在樹中的移動路徑,為1的時候表示選擇該組資料,為0的表示不選擇該組資料
void getBest(int i)
{
if(i>=n)//遞迴結束的判定條件
{
if(cv>bestv)
bestv=cv;
return;
}
if(cw+w[i]<=c)//進入該節點的右孩子(值為1的孩子)
{
X[i]=1;
cw+=w[i];
cv+=v[i];
getBest(i+1 );
cw-=w[i];//此處回溯
cv-=v[i];
}
X[i]=0;//進入該節點的右孩子(值為0的孩子)
getBest(i+1);
}
int main()
{
getBest(0);
printf("%d",bestv);
return 0;
}