YTU2362:愚公的遗愿 C++ 01背包

文章描述了一个关于公平分配石头的编程问题,愚公的两个儿子希望平分石头负担。给定石头数量和重量,目标是找到最小重量差的分配方案。通过动态规划求解,计算每个人能背的最大石头重量,从而得出最接近平均值的分配。代码示例使用C++实现,求解总和的一半最接近的背包问题。
摘要由CSDN通过智能技术生成

目录

题目描述

输入

输出

输入输出样例

样例输入 #1

 样例输出 #1

思路

该上代码了


题目描述

愚公留下遗愿,让他的两个儿子愚大和愚二完成他移山的愿望:将石头搬出大山。一直以来,愚大背大石头,将小石头留给弟弟愚二背。愚二长大后,想分担哥哥的负担,要求背大石头,让哥哥背小石头。愚大不同意。兄弟二人多次讨论,也不能提出一个公平背石头的方案。

假设有 nnn 块石头,将这 nnn 个石头尽可能平分给兄弟二人,即两人分得的石头重量差异最小。请你帮助愚家兄弟解决这个问题。

输入

多组输入,对于每组数据:

第一行,一个整数 nnn (3≤n≤1000)(3 \le n \le 1000)(3≤n≤1000),表示石头的数目;

第二行,nnn 个整数,对于每个整数 aia_iai​ (1≤ai≤50)(1 \le a_i \le 50)(1≤ai​≤50),表示第 iii 块石头的重量。

输出

对于每组输入,输出两个数 x,yx, yx,y (x≤y)(x \le y)(x≤y),分别表示两个兄弟背的石头总重量。

输入输出样例

样例输入 #1

3
1 2 3

 样例输出 #1

3

思路

也就是把石头的和除以2,让其中一个人最接近那个中间值,也就是01背包了!

该上代码了

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int sum = 0;
int num = 0;
int dp[50000];
int a[1005];
int n;
int main()
{
	while (cin >> n)
	{
		sum = 0;
		num = 0;
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; i++)
		{
			cin >> a[i];
			sum += a[i];
		}
		num = sum / 2;
		for (int i = 1; i <= n; i++)
		{
			for (int j = num; j >= 1; j--)
			{
				if (j >= a[i])
					dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
			}
		}
		cout << dp[num] << " " << sum - dp[num] << endl;
	}
	return 0;
}

明天就是儿童节,希望大家写代码时也要保持一颗童心哦!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值