165 - Stamps(dfs)
来源:互联网 发布:橱柜衣柜设计软件 编辑:程序博客网 时间:2024/05/18 09:18
题目;165 - Stamps
题目大意:给出h,h代表每份文档最多可以贴的邮票数目,k代表供选择的邮票种类。求由这两个条件下可以得到邮票面值最大值。
这个最大值是指连续的最大值,就是如果7是最大值,就说明1-7连续都是可以产生的,而八不可以。
解题思路:这题就是搜索,但是遇到了枚举邮票的面值上限的问题,一开始只考虑了到了最后一张邮票,结果就超时了,考虑的不够周到。后来看了别人的题解:原来第i张邮票的面值是有上限的,如果前面的这i-1类邮票所能组成的最大值,那么后面的这张邮票最大也只能取前的那i - 1类邮票的最大值+ 1,再大的话就会有不连续的面值产生了。例如第一张是1的话,第二类面值的邮票最大只能是4,如果是5的话,4就没法产生了。
#include<stdio.h>#include<string.h>const int N = 9;int h, k, vis[200], flag, max, c[N], co[N], mc[N];void count (int cur, int sum, int n) {vis[sum] = 1;if (n >= h)return;for (int i = 0; i <= cur; i++)count(cur, sum + c[i], n + 1);}void dfs (int cur) {if ( cur == k) {if (mc[cur - 1] > max) {max = mc[cur - 1];memcpy(co, c, sizeof(c));} return;}for (int j = c[cur - 1] + 1; j <= mc[cur - 1] + 1; j++) {memset(vis, 0, sizeof(vis));c[cur] = j;count(cur, 0, 0);int i = 1, num = 0;while (vis[i++])num++;mc[cur] = num;dfs(cur + 1);}}int main () {while(scanf("%d%d", &h, &k), h || k) {memset(vis, 0, sizeof(vis));memset(c, 0, sizeof(c));memset(mc, 0, sizeof(mc));c[0] = 1;max = 0;mc[0] = h;dfs(1);for (int i = 0; i < k; i++)printf("%3d", co[i]);printf(" ->%3d\n", max);}return 0;}
1 0
- 165 - Stamps(dfs)
- uva 165 Stamps (DFS)
- UVa 165 Stamps 【DFS】
- POJ 1010 STAMPS(dfs)
- UVA 165 Stamps (DFS深搜回溯)
- POJ1010 STAMPS(DFS+剪枝)
- 【DFS】Poj1010 STAMPS
- POJ 1010 STAMPS(DFS)
- uva 165 Stamps (回溯)
- CF-29C - Mail Stamps(DFS+离散化)
- Codeforces 29C:Mail Stamps(STL的应用+DFS)
- 165 - Stamps
- POJ 1010 STAMPS (DFS + 剪枝)
- uva - 165 - Stamps(回溯、模拟)
- UVa 165 - Stamps 解题报告(暴力)
- UVa 165 - Stamps(连续邮资问题)
- codeforces 29C Mail Stamps(dfs)
- uva 165 - Stamps
- Windows——如何去除桌面旋转快捷键
- 友善之臂 mini2440 root_qtopia 文件系统启动过程分析
- stl-vector
- java判断手机访问还是电脑访问
- 大二的时候的一个小项目---实现四则运算的逻辑分析实现(小型编译器)
- 165 - Stamps(dfs)
- 服务器端通过http请求区分是mobile还是pc
- Java面试和Android面试经典题
- NYOJ36-最长公共子序列
- js 如何获取request中的值
- 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解
- 自定义CustomProgressDialog
- ios url 编码和解码
- oracle statistics_level