从0-1背包问题学习回溯法、分支界限法、动态规划

一、0-1背包问题的描述

下面将使用回溯法、分支界限法、动态规划法来分析和解决此问题。


二、回溯法

(1)算法步骤


(2)代码如下(没有裁剪函数):

用i和n来判断结束与否,是因为解空间结构是完全二叉树,用两节点间的边的深度表示物品序号,用两节点之间的边的01值表示该物品选择与否。


#include<stdio.h>
int n, c, bestp;//物品的个数,背包的容量,最大价值
int p[10000], w[10000], x[10000], bestx[10000];//物品的价值,物品的重量,x[i]暂存物品的选中情况,物品的选中情况void Backtrack(int i, int cp, int cw)
{ //cw当前包内物品重量,cp当前包内物品价值int j;if (i>n)//回溯结束{if (cp>bestp){bestp = cp;for (i = 0; i <= n; i++)//这里从0开始也无妨,因为后面输出是从1开始的 bestx[i] = x[i];}}elsefor (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");getchar(); getchar();return 0;
}

2、动态规化

#include<stdlib.h>
#include<stdio.h>int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值
int max(int a, int b)  //一个大小比较函数,用于当总重大于第I行时 
{if (a >= b)return a;else return b;
}void Knap(int n, int w[], int v[], int x[], int C)
{int i, j;for (i = 0; i <= n; i++)V[i][0] = 0;for (j = 0; j <= C; j++)//j居然是离散的V[0][j] = 0;for (i = 0; i <= n - 1; i++)for (j = 0; j <= C; j++)if (j<w[i])V[i][j] = V[i - 1][j];elseV[i][j] = max(V[i - 1][j], V[i - 1][j - w[i]] + v[i]);//输出相应的选择物品j = C;for (i = n - 1; i >= 0; i--){if (V[i][j]>V[i - 1][j]){x[i] = 1;j = j - w[i];}elsex[i] = 0;}printf("选中的物品是:\n");for (i = 0; i<n; i++)printf("%d ", x[i]);printf("\n");}int main()
{int s;//获得的最大价值int w[4];//物品的重量   重量  价值  和物品的状态 均对应着存到数组中,物品从1开始。 int v[4];//物品的价值int x[4];//物品的选取状态   选中则是1  没选中为0 int n, i;int C;//背包最大容量n = 4;printf("请输入背包的最大容量:\n");scanf("%d", &C);printf("物品数:\n");scanf("%d", &n);printf("请分别输入物品的重量:\n");for (i = 0; i<n; i++)scanf("%d", &w[i]);printf("请分别输入物品的价值:\n");for (i = 0; i<n; i++)scanf("%d", &v[i]);Knap(n, w, v, x, C);printf("最大物品价值为:\n");printf("%d\n", s);system("pause");return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高可用性的HDFS—Hadoop分布式文件系统深度实践

《高可用性的HDFS—Hadoop分布式文件系统深度实践》基本信息作者&#xff1a; 文艾 王磊 出版社&#xff1a;清华大学出版社 ISBN&#xff1a;9787302282587上架时间&#xff1a;2012-5-14出版日期&#xff1a;2012 年5月开本&#xff1a;16开页码&#xff1a;371版次&#xff…

【作品】超级玛丽射击版

【下载地址】稍后上传 【以下内容摘自试验报告&#xff0c;可能狗屁不通&#xff0c;尽情谅解】 &#xff0d;游戏介绍: 简单的射击游戏,键盘控制动作[角色的移动,跳跃等],鼠标控制攻击的位置方向, 单击鼠标即射击,同时可以设置游戏规定时间,时间到则结束游戏. &#xff0d;游戏…

MySQL锁的用法之行级锁

2019独角兽企业重金招聘Python工程师标准>>> 行级锁是MySQL中粒度最小的一种锁&#xff0c;他能大大减少数据库操作的冲突。但是粒度越小&#xff0c;实现的成本也越高。MYISAM引擎只支持表级锁&#xff0c;而INNODB引擎能够支持行级锁&#xff0c;下面的内容也是针…

matlab中二维插值函数interp2的使用

下面是一段产生log-normal分布的代码&#xff0c;以此进行说明。 clear all; clc; for t1:100Traffic(t) curve(t); end MaxTraffic max(Traffic); w 0.2; Wmax 2*pi*w/3000; x[0:10:300]; y[0:10:300]; Nxlength(x); Nylength(y); Sigma 0.53; t 0&#xff1b; M 10*cu…

8天玩转并行开发——第五天 同步机制(下)

承接上一篇&#xff0c;我们继续说下.net4.0中的同步机制&#xff0c;是的&#xff0c;当出现了并行计算的时候&#xff0c;轻量级别的同步机制应运而生&#xff0c;在信号量这一块 出现了一系列的轻量级&#xff0c;今天继续介绍下面的3个信号量 CountdownEvent&#xff0c;Se…

Quartz 2D编程笔记

当我们需要在一个图形上下文中构建一个路径时&#xff0c;我们需要调用CGContextBeginPath来标记Quartz。然后&#xff0c;我们调用函数CGContextMovePoint来设置每一个图形或子路径的起始点。在构建起始点后&#xff0c;我们可以添加直线、弧、曲线。记住如下规则&#xff1a;…

个人管理 - 书籍推荐(待读)

在《个人管理 &#xff0d; 书籍推荐&#xff08;已读&#xff09;》中推荐了一些书籍&#xff0c;有些人从中选取了一些&#xff0c;但其实还有很多好书我还没有读&#xff0c;为了给大家更多选择&#xff0c;我把我欠下的书债也贴上来。由于豆瓣还没有提供书列表的功能&#…

Node.js用6行代码1个JS文件搭建一个HTTP静态服务器

2019独角兽企业重金招聘Python工程师标准>>> Node.js宣言&#xff1a;Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes i…

ERROR: Start Page at 'www/index.html' was not found

用Xcode 4.3.2新建了一个PhoneGap的应用&#xff0c;www目录下存在index.html文件&#xff0c;但是运行的时候&#xff0c;报错&#xff1a;ERROR: Start Page at www/index.html was not found&#xff0c;这是PhoneGap和Xcode 4还不兼容导致的。 可以右键项目名->Add File…

Linux线程-互斥锁pthread_mutex_t

在线程实际运行过程中&#xff0c;我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务&#xff1b;互斥锁的使用过程中&#xff0c;主要有pthread_mutex_init&#xff0c;pthread_mutex_destory&#xff0c;pthread_mutex_lock&#xff0c;pthread_mutex_unlock这几个函…

ULS 日志为空

解决方案&#xff1a; 1.保存为ChangeAccounts_SPTraceV4.ps1&#xff0c;运行 # Get the tracing service. $farm Get-SPFarm $tracingService $farm.Services | where {$_.Name -eq "SPTraceV4"} # Get the "svc_sp_services" managed account. $manag…

2013 ACM/ICPC Asia Regional Changsha Online - C

2019独角兽企业重金招聘Python工程师标准>>> 竟然没写出来 还是比较坑&#xff0c;好吧 Color Representation Conversion Time Limit: 1 Second Memory Limit: 32768 KB So far, there are many color models in different area. For screen display, the most …

BNUOJ 4358 左手定则 搜索

题目链接&#xff1a;http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid4358 一道很好的搜索题&#xff0c;要注意DFS函数的写法&#xff0c;特别是return的写法。 View Code 1 #include <iostream>2 #include <cstring>3 #include <cstdio>4 using names…

CentOS安装Confluence Wiki步骤

参考&#xff1a;http://supernetwork.blog.51cto.com/2304163/1187066参考&#xff1a;http://yjiang.tk/?p1085需要的文件CentOS-6.5-x86_64-minimal.isojre-7u67-linux-x64.rpmatlassian-confluence-5.4.4-x64.binmysql-connector-java-5.1.32-bin.jarconfluence5.1-crack.…

使用VS2015编写C/C++开始步骤

下面围绕如何建立工程、如何添加代码和运行展开说明。 一、建立工程 &#xff08;1&#xff09;打开VS2015&#xff0c;然后在菜单栏中选择file—>New—>Project&#xff1b; &#xff08;2&#xff09;在弹出的界面中&#xff0c;选择Win32&#xff0c;编辑工程名字、…

PWM调光方法在LED亮度调节中的应用

LED 是一种固态电光源&#xff0c; 是一种半导体照明器件&#xff0c;其电学特性具有很强的离散性。它具有体积小、机械强度大、功耗低、寿命长&#xff0c; 便于调节控制及无污染等特征&#xff0c;有极大发展前景的新型光源产品。LED 调光方法的实现分为两种&#xff1a; 模拟…

redhat rpmforge epel 安装源配置

参考阅读 epel 直接安装 RPMforge for CentOS 6 The default RPMforge repository does not replace any CentOS base packages. In the past it used to, but those packages are now in a separate repository (rpmforge-extras) which is disabled by default. You can fi…

leetcood学习笔记-2-两数相加

题目描述&#xff1a; 方法一&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # self.next Noneclass Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:cur…

Forward框架的逆袭:解析Forward+渲染

转载请注明出处为KlayGE游戏引擎&#xff0c;本文地址为http://www.klayge.org/2012/04/21/forward%e6%a1%86%e6%9e%b6%e7%9a%84%e9%80%86%e8%a2%ad%ef%bc%9a%e8%a7%a3%e6%9e%90forward%e6%b8%b2%e6%9f%93/ AMD在7900系列显卡发布的时候同时推出了Leo demo&#xff0c; 并说明它…

Java NIO学习系列三:Selector

前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点&#xff0c;在NIO中都是通过Channel和Buffer的协作来读写数据的&#xff0c;在这个基础上通过selector来协调多个channel以同时读写数据&#xff0c;本文我们就来学习一下selector。 Java NIO中引入…