题目大意: 有一批设备要分给两个学院,每个设备具有每一个的价值,要使两个学院分得的设备价值可能相等,如果不相等,那前面的学院分得的设备价值要大于后面学院。
解题思路: 转换成dp , 也就是 0-1背包问题。把背包的容量定位 总价值/2 。 看了半天还是没怎么搞懂 代码是如何实现的。贴个代码,留着慢慢看 。再来一个 大神的讲解:
http://blog.csdn.net/insistgogo/article/details/8579597
代码如下:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int value[5500],dp[250000];
int main()
{
int i,n,v,m,l,j,sum;
while(scanf("%d",&n)!=EOF&&n>0)
{
l=0;sum=0;
memset(dp,0,sizeof(dp));
memset(value,0,sizeof(value));
for(i=0;i<n;i++)
{
scanf("%d%d",&v,&m);
while(m--)
{
value[l++]=v;
sum+=v;
}
}
for(i=0;i<l;i++)
{
for(j=sum/2;j>=value[i];j--)
{
dp[j]=max(dp[j],dp[j-value[i]]+value[i]);
}
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}