0-1背包 HDU 1171---Big Event in HDU



题目大意:

给一个n,代表有n种设备。然后紧跟着是每种设备的价值和个数。为了公平起见,求如何分配才能实现A得到的设备的价值大于等于B得到的设备价值?

解题思路:

将价值总和平分,然后再用01背包解决。


代码实现:

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <algorithm>  
  4. using namespace std;  
  5.   
  6. int value[5005];  //用来存储价值
  7. int dp[255555];  
  8.   
  9. int main()  
  10. {  
  11.     int n,i,j,a,b,l,sum;  
  12.     while(~scanf("%d",&n),n>0)  
  13.     {  
  14.         memset(value,0,sizeof(val));  //将数组初始化为0
  15.         memset(dp,0,sizeof(dp));  
  16.         l = 0;  
  17.         sum = 0;  
  18.         for(i = 0;i<n;i++)  
  19.         {  
  20.             scanf("%d%d",&a,&b);  
  21.             while(b--)  
  22.             {  
  23.                 value[l++] = a;     //将价值存入数组  
  24.                 sum+=a;  
  25.             }  
  26.         }  
  27.         for(i = 0;i<l;i++)  
  28.         {  
  29.             for(j = sum/2;j>=value[i];j--)    //01背包  
  30.             {  
  31.                 dp[j] = max(dp[j],dp[j-value[i]]+value[i]);  //公式
  32.             }  
  33.         }  
  34.         printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);  
  35.     }  
  36.   
  37.     return 0;  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值