#include <stdio.h>
#define N 3
int w[3]={10,40,40};//3个物体的载重量
int c=70;//轮船的总载重量
int cw ; //当前获得的载重量
int bestw ;// 最优的载重量
int r=90; //剩余箱子的总重量
int x[3]={0}; //记录某一个可行解的路径
int bestx[3]={0};//记录最优解的路径
void backtrack(int i)//i表示树的层数
{
if( i>N )
{
if (cw > bestw)
{
for(int j=0;j<N;j++)
{
bestw = cw; //可能有多个可行解,在每次找到可行解后都要更新最优解
bestx[j]=x[j];//记录最优解的路径
}
}
return;//结束最后一层的函数,回溯到上一层进行递归调用
}
r -= w[i-1];
if( cw + w[i-1] <= c)//x[i-1]=1
{
cw += w[i-1];
x[i-1]=1;
backtrack(i+1);
cw -= w[i-1];//回溯到上一层又要把当前总载重量减掉
}
if( cw+r > bestw)//上界函数,如果当前重量加上剩余的最大重量都小于当前最优解的重量
{
x[i-1]=0;
backtrack(i+1);
}
r += w[i-1] ;
}
void main()
{
int i;
backtrack(1);
for(i=0;i<N;i++)
printf(“%d\n”,bestx[i]);
printf(“%d\n”,bestw);
}