1、回溯法解决
// 针对N叉树的递归回溯方法
void backtrack (int t)
{
if (t > n) {
// 到达叶子结点,将结果输出
output (x);
}
else {
// 遍历结点t的所有子结点
for (int i = f(n,t); i <= g(n,t); i ++ ) {
x[t] = h[i];
// 如果不满足剪枝条件,则继续遍历
if (constraint (t) && bound (t))
backtrack (t + 1);
}
}
}
代码:
#include<iostream>
using namespace std;
const int N=4;
int c=8;
int v[]={0,2,1,4,3},w[]={0,1,4,2,3};//下标从1开始
int x[N+1];
int best[N+1];
int cw=0;
int cv=0;
int max_v=0;//最大价值
void find(int t)
{
if(t>N)
{
if(max_v<=cv)
{
max_v=cv;
for(int i=0;i<=N+1;i++)
best[i]=x[i];
}
return ;
}
//if(cw+w[t]>c)//超重
// return;
if(cw+w[t]<=c)//左子树
{
//放
x[t]=1;
cw=cw+w[t];
cv=cv+v[t];
find(t+1);
//还原
x[t]=0;
cw-=w[t];
cv-=v[t];
}
//右子树
find(t+1);
}
void main()
{
find(1);
for(int i=0;i<=N+1;i++)
{
if(best[i]==1)
cout<<i<<endl;
}
cout<<endl;
cout<<"max_v="<<max_v<<endl;
}