• hdu1171(DP求两份物品的价值相差最小)


    题目信息:

    给出一些物品的价值和个数。分成两份,是这两份的价值相差最小(DP方法)

    http://acm.hdu.edu.cn/showproblem.php?

    pid=1171


    AC代码:

    /**
     *0-1背包问题
     *使得总背包的一半空间装尽可能多的价值
     */
    #include<iostream>
    #include<cstring>
    using namespace std;
    int dp[250000];
    int v[5500];
    int main()
    {
        int n,a,b,sum,k;
        while(cin>>n&&n>0){
            memset(dp,0,sizeof(dp));
            sum=0; k=0;
            for(int i=0;i<n;i++){
                cin>>a>>b;
                sum+=a*b;
                while(b--){
                    v[k++]=a;//全部价值装入数组
                }
            }
            dp[0]=1;
            for(int i=0;i<k;i++){
                for(int j=sum/2;j>=0;j--){
                    if(j-v[i]>=0) dp[j]=dp[j-v[i]];
                }
            }
            for(int i=sum/2;i>=0;i--){
                if(dp[i]){
                    if(sum-i>i) cout<<sum-i<<" "<<i<<endl;
                    else cout<<sum-i<<" "<<i<<endl;
                    break;
                }
            }
            /**时间长
            dp[0]=0;
            for(int i=0;i<k;i++){
                for(int j=sum/2;j>=0;j--){
                    if(j-v[i]>=0) dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
                }
            }
            if(sum-dp[sum/2]>dp[sum/2]) cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
            else cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
            **/
        }
        return 0;
    }


  • 相关阅读:
    【解题报告】2019正睿Day2
    如何卡SPFA
    【游记】2019国庆清北刷题营
    CF427D Match & Catch
    P2178 [NOI2015] 品酒大会
    Loj#6071. 「2017 山东一轮集训 Day5」字符串
    SP8093 JZPGYZ
    P3346 [ZJOI2015]诸神眷顾的幻想乡
    CF1037H Security
    CF932F Escape Through Leaf
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5060246.html
Copyright © 2020-2023  润新知