zoukankan      html  css  js  c++  java
  • HDU 1171 Big Event in HDU(01背包)

    题意:给出每个物体的价值和物体的数量,如何分使得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;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    beta版本冲刺七
    beta版本冲刺六
    beta版本冲刺五
    beta版本冲刺四
    beta版本冲刺三
    Beta版本冲刺(二)
    项目评测
    beta版本冲刺(一)
    福大软工 · 最终作业
    福大软工 · 第十二次作业
  • 原文地址:https://www.cnblogs.com/wanglaoda/p/4937158.html
Copyright © 2011-2022 走看看