题意:有N种物品,每种物品都对应一个M值,表示该物品有M件。要将这些物品能较好得平分给两个社团,即两个社团所得的价值总量差要使得最小,Computer College 所获得的价值应不小于Software College 所获得的价值
思路:乍一看不知如果去解决,仔细一想发现其实可以转换成一个01背包问题,先求出所有物品合起来的价值最大值sum,那么对于Software College 来说就转换成了它有一个sum/2的容量的背包,求它能装的物品的价值的最大值、
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int val[5005];
int dp[255555];
int main()
{
int n,i,j,a,b,l,sum;
while(~scanf("%d",&n),n>0)
{
memset(val,0,sizeof(val));
memset(dp,0,sizeof(dp));
l = 0;
sum = 0;
for(i = 0; i<n; i++)
{
scanf("%d%d",&a,&b);
while(b--)
{
val[l++] = a;//将价值存入数组
sum+=a;
}
}
for(i = 0; i<l; i++)
{
for(j = sum/2; j>=val[i]; j--) //01背包
{
dp[j] = max(dp[j],dp[j-val[i]]+val[i]);
}
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}
心得:这题还需好好理解,理解透了再回来写详细的解题报告吧,今天就先这样吧