题目意思
现在给出n种设备,接着给出你每种设备的价值和个数,现在要将这些设备分给A,B两个院系,要求两个院系分得的设备价值尽可能的接近。并且保证A 院系的价值不小于B院系。
解题思路
简单的01背包问题。要注意的一点是题上的要求输入以一个负数结束的,就这一点错误导致我找了好久的bug。。。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=1e6;
int val[maxn];///价值
int dp[maxn];
int c[maxn];///数量
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n<0)
break;
int sum=0;
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++)
{
scanf("%d%d",&val[i],&c[i]);
sum+=val[i]*c[i];
}
int temp=sum/2;
for(int i=0; i<n; i++)
{
for(int k=c[i]; k>0; k--)
{
for(int j=temp; j>=val[i]; j--)
{
dp[j]=max(dp[j],dp[j-val[i]]+val[i]);
}
}
}
printf("%d %d\n",sum-dp[temp],dp[temp]);
}
return 0;
}