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
原创粉丝点击