标签:bsp dom color sig output cut continue number blocks
Description
Input
Output
Sample Input
9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
Sample Output
6 5
Source
#include <iostream> using namespace std; int used[100]; //判断第i根木棒是否被采用 int stick[100]; //记录第i根木棒的长度 void quicksort(int left, int right) { int i, j, temp; if (left < right) { i = left, j = right, temp = stick[i]; while (i < j) { while (i < j&&stick[j] <= temp) j--; stick[i] = stick[j]; while (i < j&&stick[i] >= temp) i++; stick[j] = stick[j]; } stick[i] = temp; quicksort(left, j - 1); quicksort(j + 1, right); } } int DFS(int Len, int left, int len, int n) //Len 每根木棒的长度 left 剩余的木棒 { if (len == 0 && left == 0) return 1; if (len == 0) len = Len; for (int i = 0; i < n; i++) { if (!used[i] && stick[i] <= len) { if (i > 0 && stick[i] == stick[i - 1] && !used[i]) continue; //前面有一根和目前这根一样长的但是没有被采用 那么这根也不会被采用 第二次剪枝 used[i] = 1; if (DFS(Len, left - 1, len - stick[i], n)) return 1; else { used[i] = 0; if (stick[i] == len || len == Len) return 0; //如果这根木棒和剩余长度一样或者剩余木棒长度没有改变 那么绝对不会成功 //因为 如果选中的木棒和剩余的一样长却匹配失败 那么后面的木棒是没有希望的 //如果木棒的长度都没有改变 那假设的长度绝对不会成立的 //第三次剪枝 } } } } int main() { int n, len, sum; while (cin >> n) { sum = 0; //所有木棒的长度和 for (int i = 0; i < n; i++) cin >> stick[i], sum += stick[i]; memset(used, 0, sizeof(used)); quicksort(0, n - 1); //从大到小排列 由于每根木棒都要用到,所以从最大的一根开始,这样可以减少递归次数 len = stick[0]; //木棒最小长度应该是给出的木棒的最大长度 while (1) { if (sum%len == 0) //给出的木棒的总长度一定可以整除单根木棒的长度 第一次剪枝 if (DFS(len, n, len, n)) break; len++; //枚举木棒的长度 memset(used, 0, sizeof(used)); } cout << len << endl; } }
标签:bsp dom color sig output cut continue number blocks
原文地址:http://www.cnblogs.com/LHJL8023/p/8001364.html