• Big Event in HDU(01背包)


    /*
    题意:
    输入一个数n代表有n种物品,
    接下来输入物品的价值和物品的个数;
    然后将这些物品分成A B 两份,使A B的价值尽可能相等也就是尽量分的公平一些,如果无法使A B相等,那么就使A多一些;
    思路:
    先计算这些物品的总价值,然后从这些物品中去一些出来,使他们的价值尽可能的接近总价值的一半,
    由此可以想到用01背包的思路;
    背包容量是总价值的一半,物品体积等于物品的价值;
     
    */
     
     
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int dp[300000];
    int value[10000];
    int main()
    {
        int n;
        while(scanf("%d",&n)&&n>0)
        {
            int weight[n+1];
            int sum=0,count=0;
            int a=0;
            memset(dp,0,sizeof(dp));
            memset(value,0,sizeof(value));//多组测试数据,记得将值初始化
            for(int i=1; i<=n; i++)
            {
                scanf("%d%d",&a,&weight[i]);//输入物品的价值和物品的个数
                sum+=a*weight[i];//计算总价值
                while(weight[i]--)
                {
                    count++;
                    value[count]=a;//将每(个)物品的价值保存起来,而不是只保存每(种)物品的价值
                                   //因为是将总价值平分
                }
            }
            int k=sum/2;//背包容量是总价值的一半,此时会自动向前取整,所以k可能会比一总值的一半少些,
                       //所以到最后的结果dp[k]是B的值
            //cout<<"k="<<k<<endl;
            for(int i=1; i<=count ; i++)
                for(int j=k; j>=value[i]; j--)
                    dp[j]=max(dp[j],dp[j-value[i]]+value[i]);//01背包
            printf("%d %d ",sum-dp[k],dp[k]);//输出A  B;
        }
        return 0;
    }
    /*
     
    2
    10 1
    20 1
    3
    10 1
    20 2
    30 1
     
    */
    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    Coding Souls团队---电梯演讲
    第一次团队会议总结-NABCD分析
    软件工程团队项目介绍
    python进行四舍五入
    python列表元素两两比较
    Linux常用命令
    谷歌日历的正确用法--在谷歌日历中添加农历、天气、中国节假日
    Nose框架的安装
    python中staticmethod装饰器的作用
    python 3.x与python 2.7.x在语法上的区别
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/4979011.html
Copyright © 2020-2023  润新知