#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
bool f[45010][110];
int w[110];
struct poj2576 {
/* [问题描述]:n个人,体重分别为w[1],w[2],...,w[n]
* 将n个人分为两组,人数只差不得大于1
* 要求两组的体重和最接近
*/
/* [解题思路]:f[n][i][j]表示考虑前n个人时,第一队能否达到体重和为i且人数为j这一状态,
* 则f[n][i][j]=f[n-1][i][j] || f[n-1][i-w[n]][j-1]
* 初始值:f[0][0][0]=1
* (利用滚动数组可以省去f的第一维)
*/
int n;
void work() {
while (cin >> n) {
int total = 0;
for (int i = 1; i <= n; i++) {
cin >> w[i];
total += w[i];
}
memset(f, 0, sizeof(f));
f[0][0] = 1;
for (int k = 1; k <= n; k++) {
for (int i = k * 450; i >= 0; i--) {
for (int j = k; j >= 0; j--) {
f[i][j] = f[i][j];
if (i >= w[k] && j >= 1)
f[i][j] = f[i][j] || f[i - w[k]][j - 1];
}
}
}
int Sum, Min = 1 << 30;
for (i
poj2576-Tug of War(二维背包)
最新推荐文章于 2020-09-16 10:44:16 发布
该博客介绍了一种动态规划的解决方案,用于解决将n个人分成两组,使得两组体重和最接近的问题。通过二维背包的思路,初始化状态并利用滚动数组优化,最终找出最优解。
摘要由CSDN通过智能技术生成