using System;
using System.Collections.Generic;
using System.Text;
namespace BackRack
{
//要装入书包的货物节点
class
BagNode
{
public int mark;//货物编号,从0开始记
public int weight;//货物重量
public int value;//货物价值
public BagNode(int m, int w, int v)
{
mark = m;
weight = w;
value =
v;
}
}
//根据货物的数目,建立相应的满二叉树,如:3个货物,需要建立15个节点的二叉树,共三层(根节点所在的层记为0)
class
BulidFullSubTree
{
public static int treeNodeNum = 0;//满二叉树节点总数
public int noleafNode = 0;//满二叉树出去叶子节点外所剩余的非叶子节点
public static TreeNode[] treeNode;//存储满二叉树所有节点的数组
public BulidFullSubTree(int nodeNum)
{
treeNodeNum = Convert.ToInt32(Math.Pow(2,nodeNum+1)-1);
noleafNode = Convert.ToInt32(treeNodeNum -
Math.Pow(2,nodeNum));
treeNode = new TreeNode[treeNodeNum];
for (int i = 0; i < treeNodeNum; i++)
{
treeNode[i] = new TreeNode(i.ToString());//对二叉树的所有节点初始化
}
for (int i = 0; i < noleafNode; i++)
{
//建立节点之间的关系
treeNode[i].left = treeNode[2 * i + 1];
treeNode[i].right = treeNode[2 * i + 2];
treeNode[2 * i + 1].bLeftNode = true;//如果是左孩子,则记其标识变量为true
treeNode[2 * i + 2].bLeftNode = false;
}
treeNode[0].level=0;//约定根节点的层数为0
//根据数组下标确定节点的层数
for (int i = 1; i <= 2; i++)
{
treeNode[i].level = 1;
}
for (int i = 3; i <= 6; i++)
{
treeNode[i].level = 2;
}
for (int i = 7; i <= 14; i++)
{
treeNode[i].level = 3;
}
}
}
//利用回溯法寻找最优解的类
class
DealBagProblem
{
public TreeNode[] treeNode =
BulidFullSubTree.treeNode;//获取建立好的二叉树
int maxWeiht = 0;//背包最大承重量
int treeLevel
=Convert.ToInt32(Math.Floor(Math.Log(BulidFullSubTree.treeNodeNum,2)))+1;//二叉树的最大层数
int []optionW=new int[100];//存储最优解的数组
int[] optionV = new int[100];//存储最优解的数组
int i = 0;//计数器,记录相应数组的下标
int midTw = 0;//中间变量,存储程序回溯过程中的中间值
int midTv = 0;//中间变量,存储程序回溯过程中的中间值
int midTw1 = 0;//中间变量,存储程序回溯过程中的中间值
int midTv2 = 0;//中间变量,存储程序回溯过程中的中间值