码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1171 Big Event in HDU(01背包)

时间:2015-03-22 06:52:54      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:hdu   1171   背包   

题意:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B

思路:DP算法,背包问题,求法是先求出总价值sum,再用dp[]求sum/2最多能放多少价值!即可以求出其中一个数了,另一个就是sum-dp[sum/2]了。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX 300000
int dp[MAX],v[1000],m[1000];
int main()
{
   int i,j,n,k;
   while(cin>>n&&n>=0)
   {
       int sum=0;
       for(i=0;i<n;i++)
       {
           cin>>v[i]>>m[i];
           sum+=v[i]*m[i];
       }
        memset(dp,0,sizeof(dp));
           for(i=0;i<n;i++)
               for(j=1;j<=m[i];j++)
                   for(k=sum/2;k>=v[i]*j;k--)
                       if(dp[k]<dp[k-v[i]]+v[i])
                           dp[k]=dp[k-v[i]]+v[i];
        cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
   }
  return 0;
}

HDU 1171 Big Event in HDU(01背包)

标签:hdu   1171   背包   

原文地址:http://blog.csdn.net/wangxinxin_/article/details/44534467

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!