Vijos-p1154买蛋糕(dfs + 剪枝)
买蛋糕
描述
野猫过生日,大家当然会送礼物了(咳咳,没送礼物的同志注意了哈!!),由于不知道送什么好,又考虑到实用性等其他问题,大家决定合伙给野猫买一个生日蛋糕。大家不知道最后要买的蛋糕的准确价格,而只会给蛋糕估价,即要买一个不超过多少钱的蛋糕。众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 + 剪枝)相关推荐
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- 【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 ...
- [DFS|剪枝] leetcode 22 括号生成
[DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...
- poj2248 DFS+剪枝 or BFS
传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...
- 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)
题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...
- DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山
DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...
- 1176: 【入门】买蛋糕
题目描述 今天是路路的生日,生日蛋糕自然是少不了.路路的朋友们一起去蛋糕店来买蛋糕,可是等一行人到了蛋糕店之后,发现那里是人山人海啊-_-.这下可把店家给急坏了,因为人数过多,需求过大,所以人们要等好 ...
- 联合线程(案例顾客买蛋糕 :使用join()方法)
运行效果图: 代码: package com.niit.syntronized;/*** @author: Annie* @date:2016年6月15日* @description:线程联合(顾客到 ...
最新文章
- AOP原理-AnnotationAwareAspectJAutoProxyCreator执行时机 || InstantiationAwareBeanPostProcessor
- js date 当前日志往后一个月_【应用实例】如何利用 Python 生成器 yield 监控日志?...
- mysql算法函数_十个实用MySQL函数
- 下排牙齿中间高两边低_爱护牙齿 每半年洁牙一次
- 给窗口添加背景图的案例
- 更改路由器的外网IP
- 鸿蒙OS的指纹储存在哪里,鸿蒙OS发布以后,我们去哪里学习?
- ZigBee(CC2530)(03)数据手册分享(英文+中文)
- 提示“8080端口号被占用
- 康佳电视android,康佳电视怎么连接手机 康佳电视连接手机步骤【图文介绍】
- 客户价值模型:RFM
- openGPS.cn - 高精度IP定位原理,定位误差说明
- travis ci 自动部署
- (转载)位图的光栅操作及ROP码解析
- LoraWAN源码学习(1)--通道选择详解
- 永磁同步直线电机仿真实例,仿真教学 maxwell16.0版本 包括图中模型以及一个仿真设置要点word文档教程
- Oracle LiveLabs DB Security (数据库安全)实验汇总
- 【180622】VC++ 超经典坦克大战双人版
- 数据分析模型篇—PEST分析
- 创客教育中的空间设计实物原理