# 12591 - The Power of Distributing ## 題解: The Beauty of Distributing的測資加強版 有三個地方需要優化 **Optimization 1 :** 對reels進行由大到小的排序 **Optimization 2 :** 如果新的skill不能被剩下的填滿的話, 就回傳false **Optimization 3 :** 如果ai超過box的話, 接下來一定不符合 ## Code: ```c=1 #include <stdio.h> #include <stdbool.h> #include <string.h> #include <stdlib.h> int n, box; // n = total reel number, box = SUM / ans int a[1000]; bool vis[1000]; int cmp(const void* a, const void* b){ return *(int *)b - *(int *)a; } bool solver(int step, int sum) { if (step == n) return true; for (int i = 0; i < n; i++) { // Try to pick an unused reel to fill the current box if(vis[i]) continue; // Case 1 : If sum < box after picking the reel // => Pick more reels to fill the current box by calling solver recursively vis[i] = true; if(sum + a[i] < box){ if(solver(step + 1, sum + a[i])) return true; } // Case 2 : If sum == box after picking the reel // => Start with a new box (skill) by calling solver recursively with sum set to 0 // => IMPORTANT : You can do Optimization 2 in this case after returning from solver else if(sum + a[i] == box){ if(solver(step + 1, 0)) return true; else return false; } vis[i] = false; // Optimization 3 if (sum == 0) return false; } return false; } int main() { int T, SUM, ans; // SUM = sum of all reels, ans = total skill number scanf("%d", &T); while (T--) { // Read test case data SUM = 0; scanf("%d", &n); for (int i = 0; i < n; i++){ scanf("%d", &a[i]); SUM += a[i]; } // Optimization 1 qsort(a, n, sizeof(int), cmp); // Find the answer recursively and print the answer for (ans = n; ans > 1; ans--){ if(SUM % ans != 0) // not integer continue; box = SUM / ans; memset(vis, false, sizeof(vis)); if(solver(0, 0)) break; } printf("%d\n", ans); } return 0; } ``` ###### tags: `NTHUOJ`