NOIP 1999 邮票面值设计 解题报告
直接暴力搜索就是,没太多的算法,不过我要说的是,题目的数据根本没按照题目的范围来,比题目说的范围要大一些……鄙视出题者,,有10 4的数据,所以根据数据,我定义的MAX是427。
代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 427 int ans[11], max; int s[11]; int n, k; int count(int *need) { int i; for(i = 1; i <= MAX; i++){ if(need[i] > n){ break; } } return i - 1; } void srch(int now, int get, int *need) { int i, j, l; int tmp[MAX + 1]; if(now > k){ if(get >= max){ max = get; memcpy(ans, s, sizeof(ans)); } return; } for(i = s[now - 1] + 1; i <= get + 1; i++){ s[now] = i; memcpy(tmp, need, sizeof(tmp)); for(j = 1; j <= n; j++){ for(l = 0; l <= MAX - i * j; l++){ if(l + i * j > MAX){ break; } if(tmp[l + i * j] > need[l] + j){ tmp[l + i * j] = need[l] + j; } } } srch(now + 1, count(tmp), tmp); } } int main(int argc, char **argv) { int i, o = 0; int t[MAX + 1] = {0}; while(scanf("%d%d", &n, &k) == 2){ for(i = 1; i <= n; i++){ t[i] = i; } for(; i <= MAX; i++){ t[i] = 0xFFFFFFF; } s[1] = 1; srch(2, n, t); for(i = 1; i <= k; i++){ printf("%d ", ans[i]); } printf("\nMAX=%d\n", max); } return 0; }