Uva--165(暴力)

2014-07-16 16:12:32

题意&思路:搜索递推逐个推下一个数,范围(前个数+1,前面数所能构成的n+1)。具体思路:http://blog.csdn.net/shuangde800/article/details/7755452 这篇博文提供了暴力和动规两种思路~!

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cmath>
 5 using namespace std;
 6 
 7 int h,k,v[10],re[10],n[10],used[1000],tmax;
 8 
 9 void Find(int cur,int sum,int num){
10     used[sum] = 1;
11     if(num >= h)
12         return;
13     for(int i = 0; i <= cur; ++i){
14         Find(cur,sum + v[i],num + 1);
15     }
16 }
17 
18 void Search(int pos){
19     if(pos >= k){
20         if(n[k - 1] > tmax){
21             tmax = n[k - 1];
22             memcpy(re,v,sizeof(v));
23         }
24         return;
25     }
26     for(int i = v[pos - 1] + 1; i <= n[pos - 1] + 1; ++i){
27         memset(used,0,sizeof(used));
28         v[pos] = i;
29         Find(pos,0,0);
30         int cnt = 0;
31         while(used[++cnt]);
32         --cnt;
33         n[pos] = cnt;
34         Search(pos + 1);
35     }
36 }
37 
38 int main(){
39     while(scanf("%d %d",&h,&k) == 2){
40         if(!h && !k)
41             break;
42         memset(v,0,sizeof(v));
43         memset(n,0,sizeof(n));
44         tmax = -1;
45         v[0] = 1;
46         n[0] = h;
47         Search(1);
48 
49         for(int i = 0; i < k; ++i){
50             printf("%3d",re[i]);
51         }
52         printf(" ->%3d\n",tmax);
53     }
54     return 0;
55 }
posted @ 2014-07-16 16:15  Naturain  阅读(108)  评论(0编辑  收藏  举报