题目大意:
给一个n,代表有n种设备。然后紧跟着是每种设备的价值和个数。为了公平起见,求如何分配才能实现A得到的设备的价值大于等于B得到的设备价值?
解题思路:
将价值总和平分,然后再用01背包解决。
代码实现:
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- int value[5005]; //用来存储价值
- int dp[255555];
- int main()
- {
- int n,i,j,a,b,l,sum;
- while(~scanf("%d",&n),n>0)
- {
- memset(value,0,sizeof(val)); //将数组初始化为0
- memset(dp,0,sizeof(dp));
- l = 0;
- sum = 0;
- for(i = 0;i<n;i++)
- {
- scanf("%d%d",&a,&b);
- while(b--)
- {
- value[l++] = a; //将价值存入数组
- sum+=a;
- }
- }
- for(i = 0;i<l;i++)
- {
- for(j = sum/2;j>=value[i];j--) //01背包
- {
- dp[j] = max(dp[j],dp[j-value[i]]+value[i]); //公式
- }
- }
- printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
- }
- return 0;
- }