1. 程式人生 > >回溯法-經典 01揹包問題

回溯法-經典 01揹包問題

經典問題:

給定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; }