回溯算法――0-1背包
回溯算法的思想:每到一个十字路口A,就选择一条路走a,如果a走不通,则回到十字路口A,选择其他bcd之一,进行走。若依然走不通,则退回到A之前的十字路口,重复上面的操作。 利用回溯算法解决的经典问题:数独、八皇后、0-1背包、图的着色、旅行商问题、全排列等等。 0-1背包问题 #include <iostream> #define MAX_WEIGHT 100 using namespace std ; // arr 待装包的物品重量, // curweight 当前i物品的重量 // i 当前即将放入的i物品 // num 可用物品的数量 // bagweight 当前背包的总重量 void fill ( int * arr , int curweight , int i , int num , int & bagweight ) { if ( curweight == MAX_WEIGHT || i == num ) // 装满,或者考察完所有物品 { if ( curweight > bagweight ) { bagweight = curweight ; // 记录历史最大装载量 // cout << bagweight << "***" << endl << endl; } return ; } fill ( arr , curweight , i + 1 , num