PKU 1011

来源:互联网 发布:天刀好看的捏脸数据 编辑:程序博客网 时间:2024/06/05 18:04
#include <iostream>#include <algorithm>#include<fstream>#include<string.h >#define MAXN 64using namespace std;int N, LEN, M;   //LEN为原始棍子长度, M为原始棍子数量 int S[MAXN], MK[MAXN];bool FLAG; int cmp(int a, int b){    return a > b;}void dfs(int k, int sum, int cnt){    if (cnt == M)//当前个数为棒子的个数         FLAG = true;    else if (sum == LEN)        dfs(0, 0, cnt+1);//有cnt个棒子的长度为len,即为所需要的长度     else        for (int pre = -1, i = k; i < N; i++)            if (!MK[i] && S[i]!=pre && S[i]+sum<=LEN)            {                pre = S[i];                MK[i] = true;//MK[]数组将已经遍历的棒子进行记录,下一次访问时,跳过这根棒子,对下一根棒子进行查找,搜索                 dfs(i+1, sum+S[i], cnt);                MK[i] = false;                if (k == 0 || FLAG)                    return;            }}int main(){    int sum, i;    freopen("data_sticks.txt","r",stdin);    while (scanf("%d", &N) != EOF && N)    {        FLAG = false;        sum = 0;        for (i = 0; i < N; i++)        {            scanf("%d", &S[i]);            sum += S[i];        }        sort(S, S+N, cmp);//将S[]数组从大到小排序,以此得到在得到长度的最小值之后跳出循环         cout<<S[0]<<endl;        for (LEN = S[0]; LEN < sum; LEN++)            if (sum % LEN == 0)            {                M = sum / LEN;//棒子的长度都相等,在这里求出棒子的个数                 memset(MK, 0, sizeof(MK));                dfs(0, 0, 0);                if (FLAG)//在得到最小值后直接跳出循环                     break;            }        printf("%d\n", FLAG? LEN : sum);   }   return 0;}

0 0
原创粉丝点击