买蛋糕

描述

野猫过生日,大家当然会送礼物了(咳咳,没送礼物的同志注意了哈!!),由于不知道送什么好,又考虑到实用性等其他问题,大家决定合伙给野猫买一个生日蛋糕。大家不知道最后要买的蛋糕的准确价格,而只会给蛋糕估价,即要买一个不超过多少钱的蛋糕。众OIer借此发挥:能否用最少的钱币数去凑成估价范围内的所有价值,使得不管蛋糕价值多少,都不用找钱……
现在问题由此引出:对于一个给定的n,能否用最少的不等的正整数去组成n以内(包括n)的所有的正整数呢?如果能,最少需要多少个正整数,用最少个数又有多少不同的组成方法呢?

格式

输入格式

只有一行包含一个整数n(1<=n<=1000)。

输出格式

一行两个数,第一个数是最少需要多少个数,第二个数是用最少个数的组成方案个数。两个答案用空格分隔。

样例1

样例输入1

6

样例输出1

3 2

限制

各个测试点2s

提示

最少用三个数,有两种方法,分别是:1,2,3和1,2,4。

对于1,2,3有1,2,3,1+3,2+3,1+2+3;
对于1,2,4有1,2,1+2,4,1+4,2+4。
传送门

解题

参考大佬思路:https://blog.csdn.net/a_bright_ch/article/details/83786942
先列举一下有哪些情况,然后找规律

代码

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
const int maxn = 1002;int len, ans, n;void dfs(int k, int maxx, int sum) {// k为dfs树层数, maxx为最大的是(最后的数, 当前数), sum为和// 若不前剪枝, 会超时// if (k == len) {//     if (n <= sum) ans++;//     return;// }if (k == len) {// ans += (sum * 2 + 1) - (n - 1);int num = sum - maxx + 1;  //下一节点的孩子数//下面给出下一节点的sum的范围// sum + maxx + 1 <= newsum <= 2 * sum + 1;if (n <= 2 * sum + 1) {  // n <= newsumif (n <= sum + maxx + 1)ans += num;  //sum - maxx + 1elseans += num - (n - sum - maxx - 1);   //2 * sum + n - 2}return;}for (int i = maxx + 1; i <= sum + 1; i++) dfs(k + 1, i, sum + i);
}int main() {cin >> n;len = (int)log2(n) + 1;dfs(1, 0, 0);  // maxx, sum都是上一节点的值cout << len << " " << ans << endl;system("pause");return 0;
}

超时代码

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
const int maxn = 1002;
int dp[maxn][maxn];int len, ans, n;void dfs(int k, int maxx, int sum) {// k为dfs树层数, maxx为最大的是(最后的数, 当前数), sum为和if (k == len) {if (n <= sum) ans++;return;}for (int i = maxx + 1; i <= sum + 1; i++) {dfs(k + 1, i, sum + i);}
}int main() {cin >> n;len = (int)log2(n) + 1;dfs(1, 1, 1);cout << len << " " << ans << endl;return 0;
}

Vijos-p1154买蛋糕(dfs + 剪枝)相关推荐

  1. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  2. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  3. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  4. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  5. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  6. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

  7. 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)

    题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...

  8. DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山

    DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...

  9. 1176: 【入门】买蛋糕

    题目描述 今天是路路的生日,生日蛋糕自然是少不了.路路的朋友们一起去蛋糕店来买蛋糕,可是等一行人到了蛋糕店之后,发现那里是人山人海啊-_-.这下可把店家给急坏了,因为人数过多,需求过大,所以人们要等好 ...

  10. 联合线程(案例顾客买蛋糕 :使用join()方法)

    运行效果图: 代码: package com.niit.syntronized;/*** @author: Annie* @date:2016年6月15日* @description:线程联合(顾客到 ...

最新文章

  1. AOP原理-AnnotationAwareAspectJAutoProxyCreator执行时机 || InstantiationAwareBeanPostProcessor
  2. js date 当前日志往后一个月_【应用实例】如何利用 Python 生成器 yield 监控日志?...
  3. mysql算法函数_十个实用MySQL函数
  4. 下排牙齿中间高两边低_爱护牙齿 每半年洁牙一次
  5. 给窗口添加背景图的案例
  6. 更改路由器的外网IP
  7. 鸿蒙OS的指纹储存在哪里,鸿蒙OS发布以后,我们去哪里学习?
  8. ZigBee(CC2530)(03)数据手册分享(英文+中文)
  9. 提示“8080端口号被占用
  10. 康佳电视android,康佳电视怎么连接手机 康佳电视连接手机步骤【图文介绍】
  11. 客户价值模型:RFM
  12. openGPS.cn - 高精度IP定位原理,定位误差说明
  13. travis ci 自动部署
  14. (转载)位图的光栅操作及ROP码解析
  15. LoraWAN源码学习(1)--通道选择详解
  16. 永磁同步直线电机仿真实例,仿真教学 maxwell16.0版本 包括图中模型以及一个仿真设置要点word文档教程
  17. Oracle LiveLabs DB Security (数据库安全)实验汇总
  18. 【180622】VC++ 超经典坦克大战双人版
  19. 数据分析模型篇—PEST分析
  20. 创客教育中的空间设计实物原理

热门文章

  1. 怎么进入修复计算机界面,开机进入启动修复界面不能启动win7电脑的修复办法...
  2. centos7 80端口被占用导致nginx或httpd无法启用的解决方法
  3. Gradle剔除依赖
  4. 为什么Wannacry 勒索病毒加密的部分数据能恢复?
  5. 3.9提取电话号的区号、电话号、分机号
  6. OpenGL缓冲区对象之FBO
  7. java 读取word页码
  8. Python利用re正则表达式抓取豆瓣电影Top250排行榜
  9. 【计算机网络】思科实验(3):使用三层交换机实现跨VLAN间的通信
  10. 树莓派4B连接PCF8591模块