参考链接(https://blog.csdn.net/u013011841/article/details/38226099)
原题:
过年的时候地主给长工发工钱,地主打算切开一根金条,按照长工的工作量每人分一部分。只有金匠才能切开金条,每切一次,金匠要收金条长度个铜币,比如长度为15的金条切开一次要收15个铜币。地主希望找到一种切分方法,使得完成切分后能给金匠最少的铜币。
距离说明,比如金条长30,需要分给4位长工,每人分到的分别是6,7,8,9。一种切分方式是先切成15和15,然后再分别切分成6和9,7和8,此时地主需要给金匠的铜币最少,一共60个。
#include<iostream>
#include<algorithm>
using namespace std;
int main(void)
{
int n, W[1001];
int result=0; //最小带权路径长度为非叶子结点的和
while (cin>>n)
{
for (int i = 0; i < n; ++i)
cin >> W[i];
for (int i = 0; i < n-1; ++i) {
sort(W, W + n);
result += W[i] + W[i + 1];
W[i + 1] = W[i] + W[i + 1];
}
cout << result;
}
return 0;
}
输出结果: