0-1背包问题(C语言)
任务描述
本关任务:编写一个能求解0-1背包问题的程序。
相关知识
为了完成本关任务,你需要掌握如何编写动态规划程序
有一个背包,能装载的总重量为C<300, 有 n<100个物体,每个物体的重量为wi>0
,价值为vi>0
, 从中选取一些物体装入背包,要求这些物体的总价值最大。
编程要求
根据提示,在右侧编辑器编写函数代码
void knapsack(int n, int C, int w[], int v[], int x[])
其中,n是物体个数,C是背包容量,w是物体重量数组,v是物体价值数组.
最后求出的装包方案保存在数组x中传回测试系统.
注意w[0]...w[n-1]存放物体数据,v和x也是如此。
测试说明
平台会对你编写的代码进行测试:
测试输入:
n=5, C=100,
w[]=77 22 29 50 99
v[]=92 22 87 46 90
预期输出:
x[]=0 0 1 1 0
解析:
动态规划,dp数组,行为物品,列为背包容量。当前背包容量大于物品重量时可进行判断,当背包留出当前物品空间后的价值加上当前物品价值大于不拿当前物品的价值时,选择拿进来,否则不拿。
判断拿了哪些物品时,只需要反推即可。若价值不等于上一层的价值,则代表拿了,反推至上一个物品,背包容量减去之前的物品重量。
#include<stdio.h>
#define MAXX 100void knapsack(int n, int C, int w[], int v[], int x[])
{int bag[n+1][C+1]; # dp数组int i, j;for(i=0;i<=n;i++) # 初始化第一列bag[i][0] = 0;for(i=0;i<=C;i++) # 初始化第一行bag[0][i] = 0;for(i=1;i<=n;i++) # 物品遍历{for(j=1;j<=C;j++) # 背包重量遍历{if(j<w[i-1]) # 物品重量大于背包重量{bag[i][j] = bag[i-1][j];}else # 物品重量小于背包重量{if(bag[i-1][j]<bag[i-1][j-w[i-1]]+v[i-1]) # 两者价值比较 {bag[i][j] = bag[i-1][j-w[i-1]]+v[i-1];}else{bag[i][j] = bag[i-1][j];}}} }j=C;for(int i=n;i>=1;i--) # 从最后一个物品反推{if(bag[i][j]!=bag[i-1][j]) # 拿了{j=j-w[i-1]; # 减去重量x[i-1]=1; # 记录拿了的数据}elsex[i-1]=0; # 记录没拿的数据}
}int main(){
int n,C;
int w[MAXX],v[MAXX],x[MAXX];scanf("%d %d",&n,&C);for(int i=0;i<n;i++)scanf("%d",&w[i]);for(int i=0;i<n;i++)scanf("%d",&v[i]); knapsack(n,C,w,v,x);int vsum=0;for(int i=0;i<n;i++){vsum+=x[i]*v[i]; // printf("%d %d",x[i],v[i]);}printf("%d",vsum);return 1;
}
0-1背包问题(C语言)相关推荐
- 回溯法经典例题--0/1背包问题--C语言
问题描述: 设n个物品的编号为0~n-1,重量和价值分别用数组w[]与v[]存放,背包限制重量用W表示,X[]存放最优解,x[i]的值为0.1分别表示物品i不在.在背包内. 求解: ...
- C语言动态规划法解决0/1背包问题(详细解答)
动态规划法解决0/1背包问题(详细解答) 首先让我们回顾一下动态规划法的使用规则: 一..动态规划法的实现思路: 1.划分子问题:将元问题分解为若干个子问题,每一个子问题对应一个决策,并且子问题之间具 ...
- 0/1背包问题——动态规划、回溯、分支限界法对比
0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...
- 数据挖掘SPSS Clementine 12.0.3 多国语言(含中文)破解版
数据挖掘SPSS Clementine 12.0.3 多国语言(含中文)破解版 2013-01-11 13:05 2111人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 数据挖掘(3) 作者 ...
- 0/1背包问题——动态规划方法
1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...
- 0/1背包问题-----回溯法求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 0/1背包问题-----动态规划求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 《计算复杂性:现代方法》——0.2 判定问题/语言
本节书摘来自华章计算机<计算复杂性:现代方法>一书中的第0章,第0.2节,作者 [美]桑杰夫·阿罗拉(Sanjeev Arora),博阿兹·巴拉克(Boaz Barak),译 骆吉洲,更多 ...
- JSP2.0中的表达式语言(EL表达式)
转载自 JSP2.0中的表达式语言(EL表达式) EL语法 EL的语法很简单,他最大的特点就是使用上很方便 例: ${sessionScope.user.sex} 所有EL都是以${ 为起始 ...
- 【动态规划】0/1背包问题
问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec 内存限制: 64 MB 提交: 152 解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...
最新文章
- SQL中distinct的用法(四种示例分析)
- java stopwatch 功能
- 微型计算机,单片机和单板机是,9、微型计算机、单片机和单板机是()
- Error:Can’t find import 2508 in coredll.dll问题解决
- python找出在原图中的位置_Python 通过截图匹配原图中的位置(opencv)实例
- 零配置简单搭建SpringMVC 项目
- qt 正则 html,Qt 正则表达式 (一)
- Facebook Cache Token Issue
- Agilent RF fundamentals (2)- fundamental units of RF
- perl的USE和require
- 完成端口(IOCP)详解[2/2](转载)
- 如何安装xvidcore
- 大数据之flume数据采集
- 爱奇艺财报解读:连续两个季度盈利 会员同比增收7%
- 小米无线显示电脑连接到服务器,小米手机无线连接电脑_小米手机无线显示电脑...
- windows 2000 系统的不同版本
- 计算机网络安全(1)
- matlab set cdata,matlab中set语句赋值出现输入的参数的数目不足情况,求解决!
- 网易考拉Android客户端网络模块设计
- python数据结构基础(单链表,多链表,二叉树)
热门文章
- 基于 Angular 的企业级 Web 应用服务器端渲染的推荐建构
- SAP Cloud SDK for JavaScript 概述
- SAP Cloud for Customer Lead OData服务的ETAG字段
- Text store debug FM CRM_TEXT_MAINTAIN_OW
- 阮一峰react demo代码研究的学习笔记 - demo 6 debug - how check works
- SAP UI5 app view router - Haiji's application
- where is Fiori count server execution interval configured
- IBase component cannot be created and deleted in the same second
- Equipment download - post processing
- IBASE header change - read access sequence