淘宝笔试题:

有N个蛋和M个篮子,把蛋放到M个篮子里,每个篮子都不能为空。另外,需要满足:任意一个小于N的正整数,都能由某几个篮子内蛋的数量相加的和得到。写出程序,使得输入一个(N,M),输出所有可能的分配情况

#include "StdAfx.h"
#include <iostream>
#include <math.h>
using namespace std;
#define MAX 1000
int ans[MAX];
int count = 0;
int cal = 0;
//如果前x的篮子已经放了y个鸡蛋,则第x+1个篮子可以放1到y+1个鸡蛋,(如果放y+2,则取不出y+1)
//第x+2个篮子可以放(y+y+1)+1=2y+2
//第x+3个篮子可以放(2y+2+y+1+y)+1=4y+4,这样我们可以从0开始 ,依次开始遍历所有存放情况
void dfs(int hasEgg,int nextBasketIndex,int totalEgg,int totalBasket,int last){if(hasEgg==totalEgg && nextBasketIndex==totalBasket){for(int i=0;i<totalBasket;i++){printf("%d ",ans[i]);}printf("\n");count++;return ;}if(nextBasketIndex>=totalBasket||hasEgg>=totalEgg){return;}//剪枝1:如果后面的所有篮子都用最小数来填充 都比总数大if(hasEgg+last*(totalBasket-nextBasketIndex)>totalEgg)return;//剪枝2:如果后面的所有篮子都用最大数来填充 还是不够大if((hasEgg+1)*(pow(2,totalBasket-nextBasketIndex)-1)+hasEgg<totalEgg)return;for(int i=last;i<=hasEgg+1;i++){ans[nextBasketIndex] = i;cal++;dfs(hasEgg+i,nextBasketIndex+1,totalEgg,totalBasket,i);}}
int solve(int egg,int basket){if(egg>pow(2,basket)||basket>egg)return 0;dfs(0,0,egg,basket,1);return count;}
void main(){solve(16,10);printf("结果:%d\n运算次数:%d\n",count,cal);
}

转载于:https://www.cnblogs.com/yangyh/archive/2011/09/01/2162243.html

DFS+剪枝:N个蛋放入M个篮子并可以任意取相关推荐

  1. m个足球放入n个篮子中或者放苹果问题

    把m个同样的足球放进n个同样的篮子里,允许有的篮子为空,问共有几种分法? 例如:3, 2, 1和2, 1, 3是同一种分法. 输入描述: 一行两个数字n,m(1<=n<=70,1<= ...

  2. 练习---爬取薄荷网所有食物卡路里,并分类放入excel中

    首先薄荷网里有11种大的食物分类,每种大的食物分类里有10页,每页10个食物及热量记录.本来想把这一共110个url都放入queue队列中,然后爬取,但是这样会打乱食物的分类,所以就只把每个食物大类的 ...

  3. DFS剪枝优化 小猫爬山 数独

    DFS剪枝策略总结 优化搜索顺序 优先搜索分支数少(剩余选择少)的情况 排除等效冗余 若对顺序没有要求 可以将排列转化为组合 可行性剪枝 不合法的情况不进行搜索 最优化剪枝 若当前的"消耗& ...

  4. 8个球放入3个盒子方式_8种土豆做法,好吃到根本停不下来!

    石锅土豆鸡块 鸡腿3,土豆1,青椒2 洋葱一半,辣椒10g,肉桂5g 八角2,生姜10克,大蒜15g 1.将鸡腿洗净切成大块,切成薄片,切青椒,切洋葱片,姜片和蒜片去皮. 2.在锅里加油,加热.加入马 ...

  5. mvp中的m作用_将M放入MVP

    mvp中的m作用 by Howard Lo 霍华德·罗 将M放入MVP (Putting the M in MVP) Years ago, I thought I knew what my minim ...

  6. 汇编语言中将数据、代码、栈放入不同的段

    数据.代码.栈放入不同的段 在学习汇编语言,将数据.代码.栈放入不同的段.参考王爽老师的<汇编语言>第四版,对P133的汇编代码,进行了个人理解标注.仅供参考,存在错误之处,请大家斧正. ...

  7. 【Qt】QStackedWidget:将多个窗口控件放入堆中,每次只显示一个窗口控件

    1.简介 QStackedWidget可以容纳多个窗口控件,每次只显示其中一个.例如:登录页面.各种功能页面等不同时显示的窗口,可以放入QStackedWidget中. 2.demo // 创建三个页 ...

  8. 将Bean放入Spring容器中的五种方式

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/weixin_43741092/ article/details/120176466 将bean放 ...

  9. 顺序表-有序顺序表表示集合-并集(两者比较,小者放入C,未遍历继续放入)

    顺序表的存储结构: typedef struct{int data[Maxsize]; //存在顺序表中的元素int length; //存放顺序表的长度}SqList; 分析: 这里有序的顺序表,可 ...

  10. R语言使用reshape2包的melt函数将dataframe从宽表到长表(Wide- to long-format)、如果没有指定行标识符号,则所有的字段都会放入variable变量中

    R语言使用reshape2包的melt函数将dataframe从宽表到长表(Wide- to long-format).如果没有指定行标识符号,则所有的字段都会放入variable变量中 目录

最新文章

  1. Mysql sql优化(一)
  2. vuex入门,详细的讲解
  3. 提示 launch failed
  4. css outline color,css outline-color属性怎么用
  5. Spark(idea)操作mysql进行查询和插入 (代码+理解)
  6. Mysql学习总结(59)——数据库分库分表策略总结
  7. JAVA开发必须掌握的21个核心技术
  8. 区块链技术将有可能彻底颠覆音乐行业,思想启迪+P2Ptech,end
  9. jsp以及servlet中文乱码问题
  10. 【优化分类】基于matlab粒子群算法优化支持向量机分类(多输入多分类)【含Matlab源码 1559期】
  11. ROS安装教程|从零开始
  12. 51单片机电子制作DIY-----交通灯控制器
  13. 第一次做腌菜 腌柚子皮
  14. UI设计师需要掌握哪些设计软件?
  15. [git]warning: LF will be replaced by CRLF in 解决办法
  16. 弹性伸缩Auto Scaling
  17. 利用Python进行数据分析笔记-pandas建模(statsmodels篇)
  18. Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测)
  19. 心脏滴血漏洞利用(CVE-2014-0160)
  20. 第八章——手机多媒体

热门文章

  1. Mac OS安装mysql教程
  2. 老大:用脚本实现Nginx日志每天切分的功能?我:脱了裤子放屁!
  3. 还在写 BUG?试试 GitHub 官方代码扫描工具!
  4. 面试遇Spark,别怂!
  5. 10 个牛逼的一行代码就能搞定的编程技巧,你会用吗?
  6. 为什么有那么多人选择Python,真的有那么好吗?
  7. Java集合框架介绍
  8. 15 张 Vim 速查表奉上,帮你提高N倍效率!
  9. 推荐几个不错的技术公众号
  10. 30 岁前的年轻人,一拨在迷茫,一拨在弯道超车