题意:给出n种设备价值与数目 求最佳平分
将问题转化为01背包 从n+m种价值分别为val[i]~val[m+n]的物品中选出总和最接近sum/2的子集的和
状态转移方程 :
for(int i = 0; i < k; i++){
for(int v = sum/2; v >= val[i]; v--){
dp[v] = max(dp[v], dp[v-val[i]] + val[i]);
}
}
代码 :
#include<bits/stdc++.h>
using namespace std;
int val[5005];
int dp[1000000];
int n;
int main(){
while(cin >> n && n > 0){
//if(n == -1) break;
memset(val, 0, sizeof(val));
memset(dp, 0, sizeof(dp));
int sum = 0;
int k = 0;
for(int i = 0; i < n; i++){
int a, b;
cin >> a >> b;
while(b--){
val[k++] = a;
sum += a;
}
}
for(int i = 0; i < k; i++){
for(int v = sum/2; v >= val[i]; v--){
dp[v] = max(dp[v], dp[v-val[i]] + val[i]);
}
}
cout << sum - dp[sum/2] <<' ' << dp[sum/2] << endl;
}
return 0;
}