题目;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; }