zoukankan      html  css  js  c++  java
  • 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
     
    */
    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    GO异常 | runnerw.exe: CreateProcess failed with error 21
    tab切换效果
    第一次码前端页面的经历
    开博第一天
    软件架构参考模板-软件架构设计学习第三天(原创)
    架构设计基础-软件架构设计学习第二天(非原创)
    IT架构师介绍-软件架构设计学习第一天(非原创)
    Android常见面试题学习第二天(原创)
    Android常见面试题学习第一天(原创)
    Netty简单介绍(非原创)
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/4979011.html
Copyright © 2011-2022 走看看