现在有 n 种水果,每一种水果都有一个重量,现在想将这些水果分给两个小朋友,要求这两个小朋友每一个人分到的水果的重量总和相同(个数可以不同,总重量相同即可),剩下的水果就需要丢掉,现在想知道最少需要丢多少重量的水果才能满足要求分给两个小朋友。 输入 第一行有一个整数 n; 第二行有 n 个整数,分别为每种水果的重量。 输出 最少需要丢掉水果的重量。c++代码实现
时间: 2024-03-03 15:50:30 浏览: 83
我们第一行包括两个整数n,k(1<=n<=100,k<=6e5),表示有n个数字,目标和为k 第二行输入n个整数(c1 c2
这是一个比较典型的01背包问题的变形。可以使用动态规划来解决。
具体的思路是:首先求出所有水果的总重量 sum,然后将问题转化为在重量不超过 sum/2 的情况下,背包所能容纳的最大价值(即水果重量)是多少。最后用总重量减去这个最大价值,就是需要丢弃的水果重量。
以下是C++代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> w(n); // 每个水果的重量
int sum = 0; // 所有水果的总重量
for (int i = 0; i < n; i++) {
cin >> w[i];
sum += w[i];
}
vector<int> dp(sum / 2 + 1); // 背包容量为 0 到 sum/2
for (int i = 0; i < n; i++) {
for (int j = sum / 2; j >= w[i]; j--) {
dp[j] = max(dp[j], dp[j - w[i]] + w[i]); // 01背包
}
}
int ans = sum - dp[sum / 2] * 2; // 需要丢弃的水果重量
cout << ans << endl;
return 0;
}
```
希望能够帮到你!
阅读全文