整数数组,长度为n,分为m份。求m最大值 - crazyhacking的专栏 - 博客频道 - CSDN.NET


题目1251:序列分割
http://ac.jobdu.com/problem.php?pid=1251
整数数组,长度为n,分为m份。求m最大值 - crazyhacking的专栏 - 博客频道 - CSDN.NET
题目:.一个整数数组a,长度为n,将其分为m份,使各份的和相等,求m的最大值
  比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; 
  {3,6}{2,4,3} m=2
  {3,3}{2,4}{6} m=3 所以m的最大值为3

X. 
1求出数组和SUM。
2假设可以分成m组,找到一个合适的m.
m的取值为sum%m=0,m<=sum/max(a[i])
3 从大到小验证找到一个可行的m值.
此过程可以用递归。f(a,m)=f(a-set,m-1)
将整个数组作为一个集合,最大的可能值就是集合的大小了,最小肯定是1,那么从2开始一次判断。如果集合可被k等分,那么首先集合的和能够被k整除,如果这个条件满足,则重复k-1次从这个集合中取出和为sum/k的子集合。
45-数组分为m份和相等

12int verify_group(int* a, int size, int sum, int d, int* aux,
13        int target, int group_id) {
14    if (target < 0) {
15        return 0;
16    else if (target == 0) {
17        group_id++;
18        target = sum / d;
19 
20        if (group_id == d+1)
21            return 1;
22    }
23 
24    for (int i = 0; i < size; i++) {
25        if (aux[i] != 0)
26            continue;
27 
28        aux[i] = group_id;
29        if (verify_group(a, size, sum, d, aux, target - a[i], group_id))
30            return 1;
31 
32        aux[i] = 0;  // a[i]分配失败,重新置为未分配状态
33    }
34    return 0;
35}
36 
37int max_group(int* a, int size) {
38    // 求数组的和
39    int sum = 0;
40    for (int i = 0; i < size; i++)
41        sum += a[i];
42 
43    int* aux = new int[size];
44    for (int d = size; d >= 2; d--) {
45        if (sum % d != 0)  // 不可能划分成d份
46            continue;
47 
48        memset(aux, 0, sizeof(int) * size);
49 
50        if (verify_group(a, size, sum, d, aux, sum / d, 1)) {
51            //分组成功,打印
52            cout << "group_index:" << endl;
53            print(aux, size);
54 
55            delete []aux;
56            return d;
57        }
58    }
59 
60    delete aux;
61    return 1;

62}
http://blog.csdn.net/zhang_hui_cs/article/details/25545677

  1. // 从数组中找出和为sum的组合。  
  2. bool DivideArray(int arr[], bool tags[], int size, int sum)  
  3. {  
  4.     if (sum < 0)  
  5.         return false;  
  6.     else if (sum == 0)  
  7.         return true;  
  8.   
  9.     for (int i = size - 1; i >= 0; i--)  
  10.     {  
  11.         if ((!tags[i]) && (arr[i] <= sum))  
  12.         {  
  13.             tags[i] = true;  
  14.             if (DivideArray(arr, tags, size, sum - arr[i]))  
  15.                 return true;  
  16.             else  
  17.                 tags[i] = false;  
  18.         }  
  19.     }  
  20.   
  21.     return false;  
  22. }  
  23.   
  24. int DivideArray(int arr[], int size)  
  25. {  
  26.     if (size <= 1)  
  27.         return (size >= 0 ? size : 0);  
  28.   
  29.     // 计算数组元素之和  
  30.     int m, sum, i;  
  31.     m = sum = 0;      
  32.     for (int i = 0; i < size; i++)  
  33.         sum += arr[i];  
  34.   
  35.     bool *tags = new bool[size];  
  36.   
  37.     for (m = size; m > 1; m--)  
  38.     {  
  39.         if (sum % m != 0)  
  40.             continue;  
  41.   
  42.         memset(tags, 0, sizeof(bool) * size);  
  43.   
  44.         for (i = 0; i < size; i++)  
  45.         {  
  46.             if (!tags[i])  
  47.             {  
  48.                 // 如果元素i没有分块,就将其分块。  
  49.                 tags[i] = true;  
  50.   
  51.                 // 如果i元素分块失败,就跳出for循环,m值失败。  
  52.                 if (!DivideArray(arr, tags, size, sum / m - arr[i]))  
  53.                     break;  
  54.             }  
  55.         }  
  56.   
  57.         if (i >= size)  
  58.         {  
  59.             // 如果i>=size,表示数组元素都被成功分配,此时m为最大值。  
  60.             break;  
  61.         }  
  62.     }  
  63.           
  64.     return m;  
X. http://t.jobdu.com/thread-7974-1-1.html
剪枝1:由大到小顺序排列,每次选择重上次选择的后一个开始。
剪枝2:如果一个数字把一组填满了,不需要考虑用更小的木棍填补这一组了,进行对下一组的搜索。
剪枝3:设对一组的搜索开始时,当前尚未用的最大的数字是a,如果把a选入不行,那么目前的状态应舍弃,因为这个数字a是必然要处理的,而放到后面处理,只会可用数字更少,而亦必然不可以。
剪枝4:由于数字已排序,前面一个数字尝试后不行,则跳过下面同样的数字。
http://blog.csdn.net/xiexingshishu/article/details/27242891
The solve method is nit implemented well.
  1.     public boolean Try(int m)   
  2.     {  
  3.         if (sum % m != 0return false;  
  4.           
  5.         Arrays.fill(vis, false);  
  6.           
  7.         return dfs(sum / m, m, m, 0);  
  8.     }  
  9.       
  10.     public boolean dfs(int cnt, int max, int re, int s)  
  11.     {  
  12.         if (cnt == 0return true;  
  13.           
  14.         if (re == 0) {  
  15.             //找到一个组合的值为max  
  16.             return dfs(cnt - 1, max, max, 0);  
  17.         }  
  18.           
  19.         for (int i = s; i < n; i++) {  
  20.             if (vis[i] || re - numArr[i] < 0continue;  
  21.               
  22.             vis[i] = true;  
  23.             if (dfs(cnt, max, re - numArr[i], i + 1)) return true;  
  24.               
  25.             vis[i] = false;  
  26.             //剪枝在找到一个组合的值为max后,接下来的不能成立  
  27.             if (re - numArr[i] == 0break;  
  28.             //剪枝在无法找到构成max  
  29.             if (max == re) break;  
  30.               
  31.             //剪枝在未选择时,跳过相同的  
  32.             while (i + 1 < n && numArr[i + 1] == numArr[i]) i++;  
  33.         }  
  34.           
  35.         return false;  
  36.     }  

TODO: http://my.oschina.net/dapengking/blog/92183
Read full article from 整数数组,长度为n,分为m份。求m最大值 - crazyhacking的专栏 - 博客频道 - CSDN.NET

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts