题目
样例
这道题目的难点在于要让两个学院的设施的价值相等,应该先把总的价值算出来,然后把一半来作为背包的值,这样做出来的是最接近的,剩下的就是简单的01背包!
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <string>
typedef long long ll;
using namespace std;
int n,v,sum;
int ss[55], price[250010];
int f[250010];
int main()
{
while(cin >> n&& n>=0) {
memset(f, 0, sizeof(f));
sum = 0;
for (int i = 1; i <= n; i++) {
cin >> price[i] >> ss[i];
sum += (price[i] * ss[i]);
}
v = sum / 2;
for (int i = 1; i <= n; i++) {
for (int j = v; j >= 0; j--) {
for (int k = 1; k <= ss[i]; k++)
if (j >= price[i] * k)
f[j] = max(f[j], f[j - (price[i] * k)] + (price[i] * k));
}
}
cout << sum - f[v] << " " << f[v] << endl;
}
return 0;
}