回溯法解背包问题

#include <stdio.h> #include <stdlib.h> #include <string.h> #define max 10 int c[max] = {0,7,3,4,5}; int v[max] = {0,42,12,40,25}; int curv,bestv,curw,V; int use[max],bestuse[max]; /* 回溯 可以用全局变量!!! 回溯 就是在隐士图上的深度优先遍历树 而对全局变量的修改 在一次未到叶子节点或者未剪枝之前 所有的全局变量存储的都是这条路线上当前遍历节点的状态 而当节点成为死节点后,这时候 回溯就体现出来了 就是一层一层的把状态还原(数组中,一个元素一个元素的还原), 前提是在遍历子树后有回溯前的恢复工作~~ 所以这时候的全局变量的值代表的还是当前遍历节点对应状态的值 */ void backtrack(int i,int n){ //共n种物品 //当前已经处理了前i - 1种物品 //现在考虑第i中物品的处理策略 if(i > n){ //取最优值 if(bestv <= curv){ for(int j = 1;j <= n;j++) bestuse[j] = use[j]; bestv = curv; } } else{ if(c[i] + curw <= V){ use[i] = 1; curw += c[i]; curv += v[i]; backtrack(i + 1,n); //回溯前的清理 use[i] = 0; curw -= c[i]; curv -= v[i]; backtrack(i + 1,n); } else{ use[i] = 0; backtrack(i + 1,n); } } } int main(){ memset(use,0,sizeof(use)); memset(bestuse,0,sizeof(bestuse)); curv = 0; curw = 0; bestv = 0; V = 7; backtrack(1,4); for(int i = 1;i <= 4;i++) printf("%d ",bestuse[i]); printf("/n%d/n",bestv); system("PAUSE"); return 0; }

你可能感兴趣的:(c,工作,System,存储,include)