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 }