165 - Stamps(dfs)

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


你可能感兴趣的:(165 - Stamps(dfs))