先看下题目:

已知14个西瓜 的重量,分别为:
23 21 12 19 18 25 20 22 16 19 12 15 17 14
请将这些瓜分成两堆,每堆的个数不限,使两堆西瓜重量之差最小。

我们知道,动态规划类问题是存在明确的步骤的:

1. 分阶段。

2. 状态迁移方程。

3. 求最优解。

这道题要把西瓜分成两堆,假设A堆和B堆,对于每个西瓜而言,要么分到A,要么分到B,和01背包有点像,要么装包要么不装包。既然和01背包问题类似,这道题就简单了。01背包存在一个约束条件,就是背包的载重量有限制。对于每个物品而言,是否装包需要和背包剩余载重量比较。那么对于西瓜分堆问题呢?什么情况下分到A组?什么情况下不分到A组?题目要求两堆西瓜重量之差最小,假设变量 avg 为西瓜总重量的一半,A堆重量不大于B堆,那么问题就变成了在不超过A堆重量上限情况下,怎么样分配西瓜使得A堆值最大,这样思考就和01背包问题一样了。假设西瓜从1到n编号,变量m[i][j]表示A堆容量j,可取西瓜范围为1,2..i的最大重量。当j < wi的时候,放不下i,这时候m[i][j] = m[i-1][j];当j >= wi的时候,需要比较放瓜和不放瓜A堆的最大重量值,即比较

m[i-1][j-wi]+wi 和m[i-1][j]的大小。通过递推我们可以求得最优解m[13][avg];在求取最优解序列的时候,和01背包一样。

这道题的难点可能在于想到A堆的约束条件,即avg,这个则需要多多思考和练习了。

下面是本题的c代码实现:

/**  西瓜分堆问题**/#include <stdio.h>#define MAX(a, b) ((a) > (b) ? (a) : (b))void main()
{int i,j,n, k, w[30] = {0}, m[30][1000] = {0};int c[30] = {0}; printf("输入西瓜个数:");   scanf("%d", &n);if (n > 30) n = 30;k = 0;for (i = 0; i < n; i++){printf("输入第%d个瓜的重量:", i + 1);scanf("%d", &w[i]);k += w[i];}//得到平均重量k = k / 2;printf("k = %d\n", k);//初始化边界for (j = 0; j <= k; j++){if (j >= w[0])m[0][j] = w[0];elsem[0][j] = 0;}//状态递推for (i = 1; i < n; i++){for (j = 0; j <= k; j++){if (j >= w[i])m[i][j] = MAX(m[i-1][j], m[i-1][j-w[i]] + w[i]);elsem[i][j] = m[i-1][j];}}//打印最优解for (j = k, i = n - 1; i >= 1; i--){if (j >= w[i]){if (m[i][j] == m[i-1][j])c[i] = 2; //B堆else{c[i] = 1; //A堆j -= w[i];} }elsec[i] = 2; }if (j >= w[0])c[0] = 1;printf("A堆的瓜:");for (j = 0, i = 0; i < n; i++){if (c[i] == 1){printf("%d ", w[i]);j += w[i];}}printf(" 总和:%d \nB堆的瓜:", j);for (k = 0, i = 0; i < n; i++){if (c[i] == 2){printf("%d ", w[i]);k += w[i];}}printf(" 总和:%d \n 两堆瓜的重量差为:%d\n",k, ((k > j) ? (k - j) : (j - k)));return;
}

参考资料:

1. 数据结构 : C语言版/ 严蔚敏,吴伟民编著

=============================================================================================

Linux应用程序、内核、驱动开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

动态规划 dp01 西瓜分堆问题 c代码相关推荐

  1. c语言变量名s_i使其随i变化,动态规划I(含细c语言代码).ppt

    动态规划I(含细c语言代码) 数字三角形 问题描述 问题描述 2.解题思路 3.参考程序 I 3.参考程序 I 程序I分析 程序分析 4.参考程序 II 4.参考程序 II 程序II分析 5.参考程序 ...

  2. ixigua解析_蓝叶分享西瓜视频地址解析php代码

    蓝叶分享西瓜视频地址解析php代码 蓝叶    网站设计    2021-01-13    13    0评论 西瓜视频这个平台里太多自媒体翻唱以及制作的精彩视频,蓝叶非常喜欢听音乐,经常去西瓜视频上 ...

  3. 太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)

    Datawhale 作者:尹晓丹,Datawhale优秀学习者 寄语:首先,简单介绍了生成模型和判别模型,对条件概率.先验概率和后验概率进行了总结:其次,对朴素贝叶斯的原理及公式推导做了详细解读:再次 ...

  4. 动态规划 dp05 插入乘号问题 c代码

    先看题目: 在一个由n个数字组成的数字串中插入r个乘号(1 <= r < n),将它分成r+1个整数,找出一种乘号的插入方法,使得这r+1个整数的 乘积最大. 例如,对给定的数串26731 ...

  5. 【机器学习入门】机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)...

    Datawhale 作者:尹晓丹,Datawhale优秀学习者 寄语:首先,简单介绍了生成模型和判别模型,对条件概率.先验概率和后验概率进行了总结:其次,对朴素贝叶斯的原理及公式推导做了详细解读:再次 ...

  6. 最小错误率贝叶斯决策的基本思想_太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)...

    Datawhale 作者:尹晓丹,Datawhale优秀学习者 寄语:首先,简单介绍了生成模型和判别模型,对条件概率.先验概率和后验概率进行了总结:其次,对朴素贝叶斯的原理及公式推导做了详细解读:再次 ...

  7. 【动态规划】01背包问题(c++代码逐句分析)

    01背包问题是一个经典的动态规划问题,不过并不适合作为动态规划的入门训练,适合作为一个动态规划的进阶训练题.如果你在此前从未接触过动态规划,那么建议先点个收藏,在学习了动态规划的相关知识点并且做了一些 ...

  8. HTML5口红西瓜见缝插针小游戏代码

    下载地址 口红西瓜HTML5见缝插针手机游戏代码,口红西瓜见缝插针手机游戏源代码. dd:

  9. 画西瓜图的html代码,西瓜图片卡通简笔画步骤

    西瓜图片卡通简笔画步骤 西瓜是我们夏季用来清热解暑的好伙伴,味道甜美,深受人们的`喜爱,小编今天就来教教大家如何画一个简单的西瓜简笔画,准备好了吗!一起动手画一画吧! 幼儿西瓜简笔画:第一步 首先在纸 ...

最新文章

  1. VLC 关键模块结构分析
  2. BZOJ4327 : JSOI2012 玄武密码
  3. java Interface
  4. 【Android工具】安卓魔力播放器moliplayer绿色无广告,手机DLNA播放器
  5. android系统功耗优化(1)---高通平台功耗优化的基础知识
  6. ostream作为函数返回值_函数的调用(一)
  7. ios - 带动画圆形旋转的进度条
  8. 黑马微服务项目乐优商城全套
  9. 官网下载mysql源码
  10. 多通道波形记录仪自动化计量校准软件NSAT-3070
  11. 无线网络常用软件与工具大全
  12. python经纬度转换xy坐标公式_经纬度坐标转换为距离及角度(Python)
  13. 轻松搭建一个BI销售数据分析系统
  14. 单片机应用系统设计技术——LCD滚动显示汉字
  15. MATLAB特殊矩阵的构造
  16. 盘点国有银行发行数字人民币现状:正全面加速落地
  17. 我们该如何高效的学习
  18. origin两个图层图例合并_科学网—Origin双坐标画法以及图例添加之方法一(以origin8.0为例) - 蔡延江的博文...
  19. docker搭建webug4.0漏洞靶场
  20. 腾讯游戏学院-----游戏引擎中的多线程和内存管理【笔记二】

热门文章

  1. .Net 4.0 (2)
  2. felzenszwalb算法_学习图像场景解析的理论和应用(二)场景解析的经典算法分析之SLIC...
  3. STM32 电机教程 12 - BLDC 闭环电流控制
  4. 离散信号处理的基本概念理解(第一章 离散序列和离散系统(全))
  5. C语言中 void* 详解及应用
  6. 学霸孩子必备的三种思维,编程思维的速成方法
  7. linux虚拟实验室关闭了,centos8禁用selinux临时关闭/永久关闭
  8. 《雷达技术丛书》分享
  9. 基于FAST-RCNN深度学习的目标识别算法的MATLAB仿真
  10. C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast