14.背包问题[递归实现]

/*------------完整代码@映雪-------------*/
/*初始化一组数据,省却输入,方便调试*/

#include <iostream>
using namespace std;
typedef struct
{
    int value[5];/*价值表*/
    int weight[5];/*重量表*/
    int num;/*数量*/
    int limitw;/*最大重量*/
    int select[5];
}Goods;
int maxvalue=0,totalvalue=115;//方案最大价值,物品总价值
int select1[5]={0};/*全局*/
void backpack(Goods &g, int i, int tw, int tv)//参数为物品i,当前选择已经达到的重量和tw,本方案可能达到的总价值
{
   int k;
   if (tw + g.weight[i] <= g.limitw)//将物品i包含在当前方案,且重量小于等于限制重量
   {
      select1[i] = 1; //选中第i个物品
      if (i < g.num - 1) //若物品i不是最后一个物品
         backpack(g, i + 1, tw + g.weight[i], tv); //递归调用,继续添加下一物品
      else //若已到最后一个物品
      {
         for (k = 0; k < g.num; ++k) //将状态标志复制到option数组中
            g.select[k] = select1[k];
         maxvalue = tv; //保存当前方案的最大价值
      }
   }
   select1[i] = 0; //取消物品i的选择状态
   if (tv - g.value[i] > maxvalue)//若物品总价值减去物品i的价值还大于maxv方案中已有的价值,说明还可以继续向方案中添加物品
   {
      if (i < g.num - 1) //若物品i不是最后一个物品
         backpack(g, i + 1, tw, tv - g.value[i]); //递归调用,继续加入下一物品
      else //若已到最后一个物品
      {
           for (k = 0; k < g.num; ++k) //将状态标志复制到option数组中
            {
                g.select[k] = select1[k];
            }
         maxvalue = tv - g.value[i]; //保存当前方案的最大价值(从物品总价值中减去物品i的价值)
      }
   }
}
int main()
{
   int sumweight=0;
   Goods g={{40,12,7,8,48},{5,2,1,1,6},5,8,{0}};/*初始化一组数据*/
   cout<<"背包最大能装的重量为:"<<g.limitw<<endl;
   for (int i = 0; i < g.num; i++)
   cout<<"第"<<i+1<<"号物品重"<<g.weight[i]<<" "<<"价值为:"<<g.value[i]<<endl;
   backpack(g,0,0,totalvalue);
   cout<<"计算结果为:"<<endl;
   for (i = 0; i < g.num; ++i)
      if (g.select[i])
      {
         cout<<"第"<<i+1<<"号物品重"<<g.weight[i]<<" "<<"价值为:"<<g.value[i]<<endl;
         sumweight+=g.weight[i];
      }
   cout<<"总重量为:"<<sumweight<< "总价值为:"<<maxvalue<<endl;
   return 0;
}
时间: 2024-10-17 14:17:27

14.背包问题[递归实现]的相关文章

编程算法 - 背包问题(递归) 代码(C)

背包问题(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 即经典动态规划问题. 可以使用深度优先搜索, 把每个部分都遍历到, 选取最优解, 但不是最好的方法. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gc

8.14 函数递归

8.14 函数递归 函数的嵌套调用是:函数嵌套函数.函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身. 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小 回溯:递归必须要有一个明确的结束条件,在满足该条件开始一层一层回溯. 递归的精髓在于通过不断地重复逼近一个最终的结果. 例如,已知一个人的年龄为16,后面每个人的年龄都是前一个人的年龄+2,求第n个人的年龄: age = 16 def age_func(

背包问题---递归及动态规划

一.原题 如果有一组物品,各个物品的质量已知,现有一个背包,背包可以容纳的质量总和S已知,问是否能从这N个物品中取出若干个恰好装入这个背包中. 二.递归算法 本质思想:设法尝试全部组合,当部分组合已经无法满足条件时,马上停止当前组合的尝试:若出现第一个满足条件的组合,马上停止尝试.使用递归回溯法实现.(感觉这东西不是我这样的菜鸟可以说明确的,还得自己慢慢体会,最好的方法就是耐住性子跟踪调试). 上"酸菜" #include <stdio.h> #include <st

背包问题递归java

1 public boolean PackageProblem(int[] arr,int start,int left,int target) 2 { 3 if(arr.length==0) 4 { 5 System.out.println("no Answer"); 6 return false; 7 } 8 if(start==arr.length) 9 { 10 int[] tempArr=new int[arr.length-1]; 11 System.arraycopy(a

回溯法-01背包问题之一:递归模式

一.回溯法 回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中按照深度优先的策略,从根节点出发搜索解空间树.算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解.如果肯定不包含,则跳过对以该节点为根的子树的系统搜索,逐层向其原先节点回溯.否则,进入该子树,继续按深度优先的策略进行搜索. 运用回溯法解题通常包含以下三个步骤: · 针对所给问题,定义问题的解空间: · 确定易于搜索的解空间结构: · 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函

《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解

原文:http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 1.前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了.前段时间真是有些堕落啊,混日子的感觉,很少不爽.今天开始继续看算法导论.今天继续学习动态规划和贪心算法.首先简单的介绍一下动态规划与贪心算法的各自特点及其区别.然后针对0-1背包问题进行讨论.最后给出一个简单的测试例子,联系动态规划实现0-1背包问题. 2.动态规划与贪心算法 关于动态规划的总结

树的递归与非递归遍历总结

树的递归遍历遍历很简单,非递归遍历要复杂一些,非递归先序.中序.后序遍历需要用一个辅助栈,而层次遍历则需要一个辅助队列. 树的结构: 1 public class Tree<T> { 2 private T data; 3 private Tree<T> left; 4 private Tree<T> right; 5 ... 6 } 用策略模式定义一个访问工具: 1 public interface Visitor<T> { 2 void process(

JAVA_递归

递归斐波那契数列 1 public class Fab { 2 3 public static void main(String[] args) { 4 System.out.println(fab(50)); 5 } 6 7 public static long fab(int n){ 8 if ( n == 1 || n == 2) 9 return 1; 10 else 11 return fab(n - 1) + fab(n - 2); 12 } 13 14 } 非递归斐波那契数列 1

递归详解(二)

1 public class A { 2 static int k=0; 3 public static void main(String args[]) { 4 char[] ss = { '1', '2', '3', '4', '5', '6', '7', '1', '2', '3', '4', 5 '5', '6', '7' }; 6 permutation(ss, 0); 7 } 8 public static void permutation(char[] ss, int i) { 9