1.题目分析:

考虑到每种物品只有2 种选择,即装入背包或不装入背包,并且物品数和背包容量已给定,要计算装入背包物品的最大价值和最优装入方案,可用回溯法搜索子集树的算法进行求解。

2.算法设计:
a. 物品有n种,背包容量为C,分别用p[i]和w[i]存储第i种物品的价值和重量,用
x[i]标记第i种物品是否装入背包,用bestx[i]存储第i种物品的最优装载方案;
b. 用递归函数Backtrack (i,cp,cw)来实现回溯法搜索子集树(形式参数i表示递归深
度,n用来控制递归深度,形式参数cp和cw表示当前总价值和总重量,bestp表示当前
最优总价值):
① 若i >n,则算法搜索到一个叶结点,判断当前总价值是否最优:
1> 若cp>bestp,更新当前最优总价值为当前总价值(即bestp=cp),更新
装载方案(即bestx[i]=x[i]( 1≤i≤n));
② 采用for循环对物品i装与不装两种情况进行讨论(0≤j≤1):
1> x[i]=j;
2> 若总重量不大于背包容量(即cw+x[i]*w[i]<=c),则更新当前总价 br=""> 值和总重量(即cw+=w[i]*x[i],cp+=p[i]*x[i]), 对物品i+1调用递归函
数Backtrack(i+1,cp,cw) 继续进行装载;
3> 函数Backtrack(i+1,cp,cw)调用结束后则返回当前总价值和总重量
(即 cw-=w[i]*x[i],cp-=p[i]*x[i]);
4> 当j>1时,for循环结束;
③ 当i=1时,若已测试完所有装载方案,外层调用就全部结束;
c. 主函数调用一次backtrack(1,0,0)即可完成整个回溯搜索过程,最终得到的bestp和bestx[i]即为所求最大总价值和最优装载方案。 
最后给出代码。

#include<iostream>
#include<stdlib.h>
#include<stdio.h
int n,c,bestp;
int p[10000],w[10000],x[10000],bestx[10000];

void Backtrack(int i,int cp,int cw)

int j;
if(i>n)
{
if(cp>bestp)
{
bestp=cp;
for(i=0;i<=n;i++) bestx[i]=x[i];
}
}
else 
for(j=0;j<=1;j++) 
{
x[i]=j;
if(cw+x[i]*w[i]<=c) 
{
cw+=w[i]*x[i];
cp+=p[i]*x[i];
Backtrack(i+1,cp,cw);
cw-=w[i]*x[i];
cp-=p[i]*x[i];
}
}
}

int main()
{
int i;
bestp=0; 
printf("请输入背包最大容量:\n");
scanf("%d",&c);
printf("请输入物品个数:\n");
scanf("%d",&n);
printf("请依次输入物品的重量:\n");
for(i=1;i<=n;i++) 
scanf("%d",&w[i]);
printf("请依次输入物品的价值:\n");
for(i=1;i<=n;i++) 
scanf("%d",&p[i]);
Backtrack(1,0,0);
printf("最大价值为:\n");
printf("%d\n",bestp);
printf("被选中的物品依次是(0表示未选中,1表示选中)\n");
for(i=1;i<=n;i++) 
printf("%d ",bestx[i]);
printf("\n");
return 0;
}

转载于:https://www.cnblogs.com/yinson/p/5554312.html

算法设计之0-1背包问题相关推荐

  1. 算法设计与分析--01背包问题(动态规划法解决)

    算法设计与分析--01背包问题(动态规划法解决) 参考文章: (1)算法设计与分析--01背包问题(动态规划法解决) (2)https://www.cnblogs.com/2228212230qq/p ...

  2. 算法设计与分析 0-1背包问题 动态规划解法【超详细】

    0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...

  3. 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

    公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...

  4. 算法设计与分析实验二:动态规划法实现TSP问题和0/1背包问题

    [实验目的] 1.熟练掌握动态规划思想及教材中相关经典算法. 2.使用动态规划法编程,求解0/1背包问题和TSP问题. TSP问题 一.实验内容: TSP问题是指旅行家要旅行n个城市,要求每个城市经历 ...

  5. 01背包问题 —— 【算法设计】动态规划

    动态规划 问题背景 有N个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 注意:01背包问题要求一个物品只有0/1两种状态,即装入背包或不装入背包.不能将 ...

  6. 变种 背包问题_【算法设计】背包问题

    题目 一个旅行者准备随身携带一个背包,可以放入背包的物品有n种,每种物品的重量和价值分别为wj, vj . 如果背包的最大重量限制是b, 怎样选择放入背包的物品以使得背包的价值最大? 目标函数: 约束 ...

  7. 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法

    一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...

  8. 算法设计 - 01背包问题的状态转移方程优化,以及完全背包问题

    01背包问题的一维状态转移方程的推导 前提摘要 前面这篇博客中: 算法设计 - 01背包问题_伏城之外的博客-CSDN博客 我们已经推导出了01背包问题的二维数组dp状态转移方程公式: 假设有N种不同 ...

  9. 算法设计与分析第5章 回溯法(二)【回溯法应用】

    第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...

最新文章

  1. 基于GPU加速全局紧耦合的激光-IMU融合SLAM算法(ICRA2022)
  2. SQL Server事务的隔离级别
  3. Aviator(表达式执行引擎)发布1.0.1
  4. Mybatsi注解开发-基础操作
  5. 【指南】远程抄表系统(AMR/AMI)中无线模块选型
  6. android 程序更换字体,Android修改自己程序字体的方法详解
  7. Atitit 动态按钮图片背景颜色与文字组合解决方案
  8. php 实现柱状图,PHP动态柱状图实现方法_PHP
  9. async和await浅析
  10. BUUCTF WEB 第四页WP(持续更新)
  11. 在浏览器上播放虚幻引擎:像素流前端教程
  12. Edxposed研究之Magisk源码下载编译的详细实战教程
  13. goldwave简单使用
  14. 使用Qt对Excel复选框等进行阅读、修改
  15. 前端大牛工程师Nicholas C. Zakas:我得到的最佳职业生涯建议
  16. SEI文献整理2:A Review of Radio Frequency Fingerprinting Techniques(2020)
  17. 第一章:计算机的软硬件基本结构_3
  18. java-php-python-ssm新生报到管理计算机毕业设计
  19. ElasticSearch服务器泄露 5700万个人数据外泄
  20. python常见几种设计模式

热门文章

  1. 坚持的力量 第十一篇
  2. 设计模式--6大原则--迪米特法则
  3. 【JUnit】BeforeClass、AfterClass、Before与After示例
  4. java基础—线程间的通讯 生产者与消费者
  5. Jmeter plugins 之 Perfmon Metrics Collector(服务器性能监控)
  6. 报错Cannot determine embedded database driver class for database type NONE解决方法
  7. kaptcha小案例(转)
  8. ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统)
  9. 进度条小飞机移动动画
  10. 解决jQuery与其他库冲突的方法