题目1251:序列分割

来源:互联网 发布:ipad1越狱后安装软件 编辑:程序博客网 时间:2024/06/10 10:09
#include <stdio.h>#include <stdlib.h>#include <string.h>  int cmp(const void *a, const void *b) {    return (*(int *)a < *(int *)b) * 2 - 1;} int n, A[100], sum;int mark[100], ans, full;  int dfs(int cnt, int max, int re, int s) {    if (cnt == 0) return 1;     if (re == 0) {        return dfs(cnt-1, max, max, 0);    }     int i;    for (i=s; i<n; i++) {        if (mark[i] || re-A[i] < 0) continue;         mark[i] = 1;        if (dfs(cnt, max, re-A[i], i+1)) return 1;        mark[i] = 0;         if (re-A[i] == 0) break;         if (max == re) break; //the largest number have try, and failed, cut         // not sucess, skip the same number        while (A[i+1] == A[i] && i+1<n) i++;     }     return 0;}  int Try(int len) {    if (sum % len != 0) return 0;     memset(mark, 0, sizeof mark);    return dfs(sum/len, len, len, 0);}  void Solve() {    qsort(A, n, sizeof(int), cmp);     int m = A[0];    while (!Try(m)) m++;     printf("%d\n", sum/m);}  int main(){    int i, j;     while (scanf("%d", &n), n) {        for (sum=i=0; i<n; i++)            scanf("%d", &A[i]), sum+=A[i];        Solve();    }    return 0;}/**************************************************************    Problem: 1251    User: cust123    Language: C++    Result: Accepted    Time:10 ms    Memory:1020 kb****************************************************************/

0 0