动态规划求解例题解题思路

问题描述

有n只猴子的力量值数据,我们需要求出将n只猴子分为两组后,这两组猴子总力量值之差的最小值,请求出这个最小值.

输入:第一行一个整数n,表示猴子数量,第二行n个整数,表示每只猴子的力量值.

输出:一行,表示分成两组后,两组猴子总力量值之差的最小值.

解题思路

先定义一些变量:a数组用于存储n名猴子的力量值,dp用于存储某一时刻最大力量值,min_m用于存储两队猴子最小力量差,再输入力量值并求和,再将问题转换成背包问题将n只猴子分成一支力量值不超过sum/2的队伍,循环处理对应的数据 ,再使用dp[j] = max(dp[j],dp[j - a[i]] + a[i])判断是否装入第i个数据:装入后是否更大,最后使用min_m = sum - dp[sum / 2] * 2在所有情况中,找出差值最小的.

代码实现

#include<bits/stdc++.h>
using namespace std;
// a数组用于存储n名猴子的力量值
// dp用于存储某一时刻最大力量值
// min_m用于存储两队猴子最小力量差 
int a[22],min_m = 2147483647;
int dp[25001];
int main(){
	int n,sum = 0;
	cin >> n;
	//1 输入力量值并求和 
	for(int i = 1;i <= n;i++){
		cin >> a[i];
		sum = sum + a[i];
	}
	//2 将问题转换成背包问题
	//将n只猴子分成一支力量值不超过sum/2的队伍
	//循环处理对应的数据 
	for(int i = 1;i <= n;i++){
		for(int j = sum / 2;j >= a[i];j--){
			//是否装入第i个数据:装入后是否更大 
			dp[j] = max(dp[j],dp[j - a[i]] + a[i]);
		}
	}
	//3 在所有情况中,找出差值最小的 
	min_m = sum - dp[sum / 2] * 2;
	cout << min_m << endl;
	return 0;
}

通过以上代码可以求出该问题的解.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值