这个代码是哪里的问题 感觉这就是最优解啊

有一个木棍,把这个木棍折成了n份,一个长度是x的木棍折成两部分会花费x体力,想知道最大和最小花费的体力是多少
输入t代表一共t组数据(t<10)
每组数据输入n代表最后变成了n个木棍,输入n个数,代表每个木棍的长度(木棍长度不超过1e5)
n<=1000

#include<iostream>
#include<algorithm>
#include<cstring>
int a[1005];
using namespace std;
int fun(int x[],int y,int z)
{
    int sum=0;
    int sun=0;
    int t=0,b=0;
    for(int i=y-1; i<z; i++)
    {
        sum=sum+x[i];
    }
    if(z-y<=2)
    {
        for(int i=z-1; i>y; i--)
        {
            sun=sun+x[i];
        }
        return sum*(z-y)-sun;
    }
    else
    {
        for(int i=y-1; i<z; i++)
        {
            sun=sun+x[i];
            if(sun>=sum-sun&&t==0)
            {
                t=1;
                if(2*sun-sum<=sum-2*(sun-x[i]))
                {
                    b=i+1;
                }
                else if(2*sun-sum>sum-2*(sun-x[i]))
                {
                    b=i;
                }
            }
        }
        return (sum+fun(x,y,b)+fun(x,b+1,z));
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,sum=0,sun=0;
        cin>>n;
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
            sum=sum+a[i];
        }
        sort(a,a+n);
        sum=sum*(n-1);
        for(int i=0; i<n-2; i++)
        {
            sun=sun+a[i];
            sum=sum-sun;
        }
        int s=fun(a,1,n);
        cout<<sum<<" "<<s<<endl;
    }
}
c++

2个回答

水题
写个搜索剪剪枝就卡过了

qq_32263561
木遇 好像不太一样 最后分成的n段小木棍长度是由输入的n个数限定了
11 个月之前 回复
qq_32263561
木遇 谢谢 哈 我去查查那个 毕竟 学没多久 感觉 这个挺难的 就是那个最少体力
11 个月之前 回复

题目表述不是很清楚,变成n段木棍应该有约束条件,这应该是一个最优解的问题,肯定是要建立相应的数学模型算法求解!

qq_32263561
木遇 就是每次分成两部分 最后成为n段木棍 分别的长度为输入的n个数,就是因为最优解 那个最少的数量感觉需要算法
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!