hdu 1455 Sticks(经典搜索)
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n,map[70],v[70]; int sum;//所有木棒的长度和 int total,length,flag; bool cmp(int x,int y) { return x > y; } //num表示组成木棒的个数,len表示已组成的长度,pos表示木棒的位置 void dfs(int num,int len,int pos) { if(num == total) { flag = 1; return; } if(flag) return ; for(int i = pos ; i < n ; i ++) { if(v[i]) continue; if(map[i] + len == length) { v[i] = 1; dfs(num + 1,0,0);//成功组合成一个木棒,num+1 v[i] = 0; } else if(map[i] + len < length) { v[i] = 1; dfs(num ,map[i] + len,i + 1); v[i] = 0; if(len == 0) return;/*如果当前搜索时,前边的长度为0,而第一根没有成功的使用,说明第一根始终要被废弃,所以这种组合必定不会成功*/ while(map[i] == map[i + 1])//这跟不符合要求的话,则长度相同的也不符合要求,直接跳过 i++; } } } int main() { int i; while(scanf("%d",&n) && n) { sum = 0; for(i = 0 ; i < n ; i ++) { scanf("%d",&map[i]); sum += map[i]; } memset(v,0,sizeof(v)); sort(map,map + n,cmp);//将木棒从长到短进行排序 for(length = map[0] ; length <= sum ; length ++)/*从最长的那根木棒开始搜索,因为组合而成的木棒长度最小的也大于等于原本最长的那根*/ { if(sum%length) continue;//如果不能被整除说明不能组成整数根木棒 flag = 0 ;//标记 total = sum/length;//以length为组合后的长度,total表示得到木棒的个数 dfs(1,0,0); if(flag) { printf("%d\n",length); break; } } } return 0; }
补充:软件开发 , C++ ,