背包问题另解

原创 2004年03月16日 16:54:00

背包问题:有不同价值,不同重量的物品n件,求这 件物品中选取一部分,
是选中物品的总重量不超过指定的限制重量,但选取的物品总价值要最大。


解题思想:利用递归求出所选取的物品的所有可能,将满足限制重量条件的进行复值,
Value始终存放最大的物品总价值,Weight是满足条件的物品的总重量,以下
是我自己写的一段代码,与《系统设计师》教程中的思路是不一样的,代码
经过编译的,而且运行结果正确:
 
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
struct Bag
{ int weight;
  int value;
}Bag[MAX];
int a[MAX];
int Value=0;
int Weight;
int comb(int m,int k)
{int i,j;
 int wei,val;
 for(i=m;i>=k;i--)
   { a[k]=i;
     if(k>1)
  comb(i-1,k-1);
     else
       { wei=0;                                //预值0
  val=0;
  for(j=a[0];j>0;j--)                  //每一种组合求它们的重量和价值
     { wei=wei+Bag[a[j]].weight;
       val=val+Bag[a[j]].value;
     }
  if(wei<=Weight&&val>Value)          //判断是否满足条件进行附值
     Value=val;
       }
    }
 return Value;
 }
void main()
{ int num,subnum;
  int l,
  clrscr();
  printf("/nenter the number of total Bag:"); //输入背包的总个数
  scanf("%d",&num);
  printf("/nenter %d number Bag'weight and Bag'value(sample *,* )/n",num);  //输入背包的重量和价值
  for(l=1;l<=num;l++)
      scanf("%d,%d",&Bag[l].weight,&Bag[l].value);
  printf("/nenter the subnumber of the Bag:");                             //输入要求背包的个数
  scanf("%d",&subnum);
  printf("/nenter the Weight for %d Bag:",subnum);                         //输入满足条件的重量
  scanf("%d",&Weight);
  a[0]=subnum;
  printf("/nthe max value is:%d",comb(num,subnum));
  getch();
}
总结:在看参考书的例子的时候,应该多动脑筋先想一想。再进行比较,对自己有很大帮助。

背包问题 ——第K优解 或 次优解

附上水题一枚: http://acm.hdu.edu.cn/showproblem.php?pid=2639
  • u014141559
  • u014141559
  • 2014年07月20日 16:01
  • 731

背包问题小总结 习题(动态规划01背包(第k优解)完全背包,多重背包)acm杭电HDU2639,HDU2602,HDU1114,HDU2191

1、01背包(每种物品只有一个)2、多重背包,完全背包 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。 求解将哪些物 品装入背包可使价值总和最大。 基本思路 这...
  • winter2121
  • winter2121
  • 2017年04月15日 16:46
  • 1037

Python 初学笔记:递归解决0-1背包问题

def conflict(m, w, state, pos): total = 0 for i in state: total += w[i] if total...
  • lsj308
  • lsj308
  • 2014年05月06日 22:17
  • 1201

背包问题解题思路

背包解题思路 背包问题大部分都是类似模样的状态转移方程dp[j]=dp[j]>(dp[j-t]+v)?dp[j]:(dp[j-t]+v); 普通类型的背包问题只需注意以下情况: 一、对于物品数量: 1...
  • zhulingyan1018
  • zhulingyan1018
  • 2015年10月18日 17:41
  • 1197

遗传算法解01背包问题(Java)

遗传算法解01背包问题,并给出了完整可运行的java代码
  • liyuming0000
  • liyuming0000
  • 2015年09月12日 16:26
  • 2832

回溯法解01背包问题(C语言版)

问题描述: 给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只...
  • baidu_20363843
  • baidu_20363843
  • 2015年12月09日 15:08
  • 2937

01背包问题的一维数组解法

核心思想: for i:=1 to N do for j=V downto c[i] do if f[j-c[i]]+w[i]>f[j] then f[j]=f[j-c[i]]+w[i]; ...
  • tr990511
  • tr990511
  • 2012年05月23日 19:30
  • 5607

动态规划法-01背包问题

一 几个概念: 最优化问题:有n个输入,它的解由这n个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为约束条件,满足约束条件的解称为问题的可行解。满足约束条件的可行解可能不止一个...
  • chifuqi
  • chifuqi
  • 2014年05月15日 11:05
  • 1460

关于背包问题的递归解法

2017年完美世界的两道笔试题 一道是0-1背包,一道是完全背包 第一道:n种价值的水果,礼品的价值为m,用礼品换取水果,如何使得换取水果数量最少?如果不能,返回-1             输...
  • molu_chase
  • molu_chase
  • 2017年03月31日 20:42
  • 474

python DEAP学习3(遗传算法) 0-1背包问题

Knapsack Problem: Inheriting from Set Again for this example we will use a very simple problem, the...
  • forethougtht
  • forethougtht
  • 2017年05月27日 14:47
  • 969
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:背包问题另解
举报原因:
原因补充:

(最多只允许输入30个字)