本文实例讲述了C#使用回溯法解决背包问题的方法。分享给大家供大家参考。具体如下:
背包问题描述:
给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高
实现代码:
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&#