用动态规划解小朋友分糖问题
为了解决谷歌一道题,想了个非主流的招数。原题是:“10块都相同的糖分给3个小朋友,每个小朋友至少分到一块糖,有几种分配方式?”,细细一想其实就是每个小朋友一块糖的前提下,再分7块糖,就是把7块糖分给3个小朋友的种类数,也就是这个二维数组中DP[2][6]的取值。
这题完全可以用排列组合来做,穷举各种可能性后乘以组合数,答案是36。
用动态规划的思路比较奇特。。总感觉发现了什么奥秘,却又阐释不清楚,大概说一说吧:
拿3块糖分给3个小朋友这个问题作为分析例子:
1、选择一个小朋友不给他糖(怪蜀黍都这么干!),然后把剩下的3块糖分给其他2个小朋友(一共有4种方式)
2、回顾一下,之前算出的值,把2块糖分给3个小朋友有6种方式,在这六种每种的基础上再加一块糖分给三个小朋友,得出这样的分配方式不能够和上边3块糖分给2个小朋友的分配方式重复,最终可以生成6种不重复的分配方式,最后一共有6+4种分配方式。
上个图:
可以看到,左边是3个人分2块糖的分配方式,右边上半部分是2个人分3块糖的分配方式。左边的列通过一次状态转化(再加一块糖给三个小朋友)即可达到右边的列的状态路径已经连上了线。比如{0,0,2}可以通过加一块糖变成{0,0,3}{0,1,2}{1,0,2},但其中第一个小朋友没有分到糖的情况已经在右边上半部分出现过了,于是只能把糖给那个没有糖的小朋友才能产生出新的状态,即{1,0,2},同理{0,2,0}和{0,1,1}都只能对应一种状态。
最后三种状态同理也只能把新加的一块糖给第一个小朋友,于是又对应三种状态(不通的路径用红色标出,绿色标出的是可行状态转化路径)。
#include <stdio.h>static const int S=10; //S块糖 static const int C=3; //C个小朋友int main() {int DP[C][S]={0};//初始化for (int i=0;i<S;i++){DP[0][i]=1; //分给一个小朋友不管分多少糖都只有一种分法 }for (int i=0;i<C;i++){DP[i][0]=i+1; //把一块糖分给i个小朋友有i种方法 }for(int i=1;i<C;i++){for(int j=1;j<S;j++){DP[i][j]=DP[i-1][j]+DP[i][j-1]; //状态转移公式,比如三块糖分给三个小朋友就等于3块糖分给2个小朋友加上2块糖分给3个小朋友 }}//输出for(int i=0;i<C;i++){for(int j=0;j<S;j++){printf("%d, ",DP[i][j]);}printf("\n");}system("pause"); }
转载于:https://www.cnblogs.com/darknightsnow/archive/2012/10/17/2728432.html
用动态规划解小朋友分糖问题相关推荐
- c语言 10个小朋友分糖,C语言的小孩分糖问题
C语言的小孩分糖问题 答案:2 信息版本:手机版 解决时间 2019-10-03 01:27 已解决 2019-10-02 10:39 10个小孩围成一圈分糖果,老师顺次分给每个人的糖块数为12,2 ...
- 大象起舞:用PostgreSQL解海盗分金问题
作者简介 张泽鹏(redraiment):51信用卡信贷业务高级架构师. 资深挖坑不填党:在51先后挖过风控.信审.数据支持等多个互金信贷相关的坑 冷技术控:51内 PostgreSQL.FreeBS ...
- 最大子段和动态规划_动态规划解最大子段和问题
1 动态规划 1.1 基本思想 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题. 与分治法的区别在于,适用于动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的:若用分 ...
- php 蛋糕一刀均分试题,5个小朋友分一个蛋糕,只准切三刀,该怎样才能平分
搞笑段子精选:有个人请客喝酒,但酒味很淡,客人尝了尝后却极力称赞他家的烹调技艺高超,十分可口.主人便说:"普通的饭菜都还没有上桌,你怎么就说好呢?"客人答道:"不用提别的 ...
- (一)c语言百题趣味题之--分糖问题
(一)c语言百题趣味题之–分糖问题 前言: 在学习C语言的道路上坎坷而又曲折,怎样提高自己的编程水平,答案很简单:多练.学习没有捷径可严,努力才是真理.接下来给大家带来c语言百题趣味题系列. 问题描述 ...
- 分糖问题和插板法:10个相同糖果分给3个小朋友,有几种分法?
[1].10个相同的糖果,分给3个孩子A.B.C,每个孩子至少一个,有多少种不同的分法? [2].10个相同的糖果,分给3个孩子A.B.C,有多少种不同的分法? [3].10个相同的糖果,分给3个孩子 ...
- PTA n个小朋友分糖果 (10 分)
题面: 为了培养小朋友们分享的意识,老师教小朋友做分糖果的游戏,把自己带的糖果分给其他小朋友. 首先,全班 n 个小朋友围成一个大圆圈,按排列顺序依次给他们编号 1,2,-,n.然后,从 1 号小朋友 ...
- 算法题解:动态规划解0-1背包问题
概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问 ...
- NCRE四级网络工程师考题详解----目录分解法
在实现文件系统时,可采用"目录项分解法"加快文件目录检索速度.假设目录文件存放在磁盘上,每个盘块 512 字节.文件控制块有 64 字节,其中文件名占 8 字节,文件控制块分解后, ...
最新文章
- 20080330 - strong-typing and weak-typing
- rhcs做HA时的资源释放脚本实现
- 开发日记-20190402
- CCNA2 - Module 2 Exam Answers (05/07/2008 14:30)
- android view强制重绘_android view 相关方法 layout draw 布局 重绘 | 学步园
- jwt配置 restful_SpringBoot实现JWT保护前后端分离RESTful API
- 基于JAVA+SpringMVC+Mybatis+MYSQL的社区养老服务网站
- 重写对象的equals和hashCode方法
- 查缺补漏知识点(一)
- canvas实现web excel高性能表格(发布开源)
- android 生成车牌号,android 车牌号识别系统app源码
- timesten mysql_TimesTen进程种类详解
- VMware12虚拟机安装
- 群晖nas服务器的虚拟机,群晖NAS用于虚拟化的存储
- #if 与 if 的区别
- python 词云生成
- cartographer源码解析(二)node_main.cc文件详解
- uni-app app平台微信支付
- canvas动态风车
- 在番看付费美女直播,不想花钱,我这样做了!
热门文章
- java horizontalbarchart_Android-MPChart,HorizontalBarChart 水平柱状图颜色渐变
- python main传参args,详解用Python处理Args的3种方法
- python不同颜色的代码_python日志通过不同的等级打印不同的颜色(示例代码)
- c++中的结构体_C ++中的结构
- java 数字 下划线_数字文字中的下划线– Java 7功能
- Java LinkedHashMap类
- quicksort算法_QuickSort算法–用C,Java,Python实现
- 我是做Java的,刚入职了,月薪20k,面试题还是很管用的
- Linux中使用定时任务每周定时清理45天以前日志
- springMVC+Mybatis实现查询分页