UVA 165 Stamps (DFS深搜回溯)
Stamps |
The government of Nova Mareterrania requires that various legal documents have stamps attached to them so that the government can derive revenue from them. In terms of recent legislation, each class of document is limited in the number of stamps that may be attached to it. The government wishes to know how many different stamps, and of what values, they need to print to allow the widest choice of values to be made up under these conditions. Stamps are always valued in units of $1.
This has been analysed by government mathematicians who have derived a formula for n(h,k), where h is the number of stamps that may be attached to a document, k is the number of denominations of stamps available, and n is the largest attainable value in a continuous sequence starting from $1. For instance, if h=3, k=2 and the denominations are $1 and $4, we can make all the values from $1 to $6 (as well as $8, $9 and $12). However with the same values of h and k, but using $1 and $3 stamps we can make all the values from $1 to $7 (as well as $9). This is maximal, so n(3,2) = 7.
Unfortunately the formula relating n(h,k) to h, k and the values of the stamps has been lost--it was published in one of the government reports but no-one can remember which one, and of the three researchers who started to search for the formula, two died of boredom and the third took a job as a lighthouse keeper because it provided more social stimulation.
The task has now been passed on to you. You doubt the existence of a formula in the first place so you decide to write a program that, for given values of h and k, will determine an optimum set of stamps and the value of n(h,k).
Input
Input will consist of several lines, each containing a value for h and k. The file will be terminated by two zeroes (0 0). For technical reasons the sum of h and k is limited to 9. (The President lost his little finger in a shooting accident and cannot count past 9).
Output
Output will consist of a line for each value of h and k consisting of the k stamp values in ascending order right justified in fields 3 characters wide, followed by a space and an arrow (->
) and the value of n(h,k) right justified in a field 3 characters wide.
Sample input
3 2
0 0
Sample output
1 3 -> 7
题意:不好理解啊。。 还是看了别人题解上的题意才懂的。。给定h和k,h代表拥有的邮票张数,k代表有几种面值的邮票。。现在你要确定k个面值。来确保能组合成的连续邮票价值可以到最大。。不是很好理解
举下样例3 和 2.当邮票面值为1 3时。可以组成1 2 3 4 5 6 7 9.连续价值最大到7.所以输出7。假如取1 4.那么组成的为
1 2 3 4 5 6 8 9 12 连续最大到6.要输出较大,所以输出是 1 3-> 7。
思路:从题目中了看出必然有一个面值为1,不然1就组不成了。然后就可以以这个1作为起点。进行2层深搜。一层搜索当前价值能不能被组合成。。一层搜索当价值不能被组合成就添加一种面值。添加的面值区间为[当前能组成的最小面值+1,当前能组成的最大面值+1]。把这几种情况进行搜索。。知道面值数为k结束。
#include <stdio.h>
#include <string.h> int h, k;
int m[10];
int out[10];
int mnum;
int jud;
int maxx; void judge(int num, int mian, int money)
{
if (jud == 1)
return;
if (mian == money)
{
jud = 1;
return;
}
if (num == h)
return;
for (int i = 0; i < mnum; i ++)
{
judge(num + 1, mian + m[i], money);
}
} void f(int num, int money)
{
if (num == k)
{
if (maxx < money)
{
maxx = money;
for (int i = 0; i < k; i ++)
{
out[i] = m[i];
}
}
return;
}
jud = 0;
judge(0, 0, money);
if (jud)
{
f(num, money + 1);
}
else
{
for (int i = 2; i <= money; i ++)
{
m[mnum] = i;
mnum ++;
f(num + 1, money);
mnum --;
}
}
}
int main()
{
while (scanf("%d%d", &h, &k) != EOF && h && k)
{
memset(out, 0, sizeof(out));
memset(m, 0, sizeof(m));
maxx = 0;
m[0] = 1;
mnum = 1;
f(0, 1);
for (int i = 0; i < k; i ++)
printf("%3d", out[i]);
printf(" ->%3d\n", maxx - 1);
}
return 0;
}
UVA 165 Stamps (DFS深搜回溯)的更多相关文章
- PAT Advanced 1155 Heap Paths (30) [DFS, 深搜回溯,堆]
题目 In computer science, a heap is a specialized tree-based data structure that satisfies the heap pr ...
- HDU5723 Abandoned country (最小生成树+深搜回溯法)
Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since aban ...
- DFS深搜——Red and Black——A Knight's Journey
深搜,从一点向各处搜找到全部能走的地方. Problem Description There is a rectangular room, covered with square tiles. Eac ...
- DFS 深搜专题 入门典例 -- 凌宸1642
DFS 深搜专题 入门典例 -- 凌宸1642 深度优先搜索 是一种 枚举所有完整路径以遍历所有情况的搜索方法 ,使用 递归 可以很好的实现 深度优先搜索. 1 最大价值 题目描述 有 n 件物品 ...
- CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】
[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...
- 深搜+回溯 POJ 2676 Sudoku
POJ 2676 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17627 Accepted: 8538 ...
- ****Curling 2.0(深搜+回溯)
Curling 2.0 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...
- 【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目
[题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- Red and Black(DFS深搜实现)
Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...
随机推荐
- 重装Win7后找回Ubuntu启动项并在Ubuntu中修复引导
1. 输入$ sudo fdisk -l 查看磁盘信息,选择Linux的磁盘,如sda10 2. 输入$ sudo -i(此步用于得到root权限,方便以下操作.) 3. 输入$ mkdir /med ...
- Windows10怎么架设局域网DNS服务器?
已采纳 需要安装Windows组件进行设置.最好是安装服务器版本的Windows. 1. 安装DNS服务 开始—〉设置—〉控制面板—〉添加/删除程序—〉添加/删除Windows组件—〉“网络服务”—〉 ...
- php开启redis扩展
1.安装redis git下载地址https://github.com/MSOpenTech/redis/releases 2.测试redis windows 运行(快捷键:windows键+R键), ...
- PHP 5.5以上 使用 CURL 上传文件
PHP 5.5以上 使用 CURL 上传文件的代码: curl_setopt(ch, CURLOPT_POSTFIELDS, [ 'file' => new CURLFile(realpath( ...
- 利用meterpreter下的Venom免杀后门
转载请注明作者:admin-神风 下载地址:https://github.com/r00t-3xp10it/venom .从Github上下载框架: tar.gz OR zip OR git clon ...
- CSS实现背景透明,文字不透明
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- hdu 4676 Sum Of Gcd 莫队+phi反演
Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...
- js跨域请求提示函数未定义的问题
我的代码是这么写的 window.onload=function(){ function sendRequest(){ var script=document.getElementById(" ...
- cloc 统计代码行数工具
cloc 统计代码行数工具 官网地址:http://cloc.sourceforge.net/ 下载完成后 会生成一个.exe文件 需要修改文件名为 cloc.exe 然后把这个文件拷贝到需要统计的根 ...
- 关于Vue的一些小技巧
前言 用Vue开发一个网页并不难,但是也经常会遇到一些问题,其实大部分的问题都在文档中有所提及,再不然我们通过谷歌也能成功搜索到问题的答案,为了帮助小伙伴们提前踩坑,在遇到问题的时候,心里大概有个谱知 ...