0-1背包问题(回溯法)

来源:互联网 发布:淘宝怎么加售后服务 编辑:程序博客网 时间:2024/05/16 04:34

一、  实验题目:

分别用回溯法和分支限界法求解0-1背包问题

二、  实验内容:

0-1背包问题:  给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

  在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i

三、  程序源代码:

A:回溯法:

// bag1.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <iostream.h>

#define  MaxSize 100       //最多物品数

int limitw;                  //限制的总重量

int maxwv=0;               //存放最优解的总价值

int maxw;

int n;                      //实际物品数

int option[MaxSize];          // 存放最终解

int op[MaxSize];             //存放临时解

struct  {

      int  weight;

    int  value;

         }a[MaxSize];             //存放物品数组

void Knap( int i, int tw, int tv)         //考虑第i个物品

{

      int j;

    if(i>=n)                                 //找到一个叶子结点

    {

           if (tw<=limitw && tv>maxwv)    //找到一个满足条件地更优解,保存它

        {

                 maxwv=tv;  maxw=tw;

            for(j=0;j<n;j++)  option[j]=op[j];

           }

    }     

    else

       {

            op[i]=1;                                  //选取第I个物品

         Knap(i+1,tw+a[i].weight, tv+a[i].value);

         op[i]=0;                             //不选取第I个物品,回溯

         Knap(i+1,tw,tv);

      }

       

    }

 

int main(int argc, char* argv[])

{

      int j;  

    n=3;  //3物品

    a[0].weight=16;a[0].value=45;    

    a[1].weight=15;a[1].value=25;

    a[2].weight=15;a[2].value=25;    

    //a[3].weight=1;a[3].value=1;

    limitw=30;                                  //限制重量不超过30

    Knap(0,0,0);

    cout<<"最佳装填方案是:"<<endl;

    for(j=0;j<n;j++)

      if(option[j]==1) 

             cout<<""<<j+1<<"种物品"<<endl;

      cout<<"总重量="<<maxw<<",总价值="<<maxwv<<endl;

      return 0;

}

回溯法测试结果:

测试数据:物品一:重量:16,价格:45;

物品二:重量:15,价格:25;

           物品三:重量:15,价格:25;

 

          

 

 

原创粉丝点击