地主希望找到一种切分方法,使得完成切分后能给金匠最少的铜币。

本文介绍了一种解决地主如何将金条切割成若干段,以最小化支付给金匠费用的问题。通过每次合并最短的两段再进行切割,最终达到总费用最低。示例代码使用了C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接(https://blog.youkuaiyun.com/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;
}

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值