Question: Find the shortest length of a wooden stick,
Enhanced version of hdoj 1518
Code:
#include <stdio.h>#include <string.h>#include <algorithm>using std::sort;#define M 70int s[M], vis[M];int n, ans;int cmp(int a, int b){return a > b;}int dfs(int cou, int cur, int pos){if(cou == n) return 1;int i;for(i = pos; i < n; i ++){if(vis[i]) continue;if(cur+s[i] < ans){vis[i] = 1;if(dfs(cou+1, cur+s[i], i+1)) return 1;vis[i] = 0;if(cur == 0) return 0;while(s[i] == s[i+1]&&i+1<n) ++i;}else if(cur+s[i] == ans){vis[i] = 1;if(dfs(cou+1, 0, 0)) return 1;vis[i] = 0;return 0;}}return 0;}int main(){int i, j;while(scanf("%d", &n), n){int sum = 0;for(i = 0; i < n; i ++){scanf("%d", &s[i]);sum+=s[i];}sort(s, s+n, cmp);for(i = n; i > 0; i --){if(sum%i == 0&&(sum/i) >= s[0]){ans = sum/i;memset(vis, 0, sizeof(vis));if(dfs(0, 0, 0)){printf("%d\n", ans);break;}}}}return 0;}
Question link: http://acm.hdu.edu.cn/showproblem.php? PID = 1, 1455
Hdoj 1455 sticks [DFS]