HDU1171-Big Event in HDU

描述:

  Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don‘t know that Computer College had ever been split into Computer College and Software College in 2002.

  The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds).

  Input contains multiple test cases. Each test case starts with a number N (0 < N <= 50 -- the total number of different facilities). The next N lines contain an integer V (0<V<=50 --value of facility) and an integer M (0<M<=100 --corresponding number of the facilities) each. You can assume that all V are different.

  A test case starting with a negative integer terminates input and this test case is not to be processed.

  For each case, print one line containing two integers A and B which denote the value of Computer College and Software College will get respectively. A and B should be as equal as possible. At the same time, you should guarantee that A is not less than B.

代码:

  多重背包转化为01背包问题,可以认为在一个容量为所有物品价值累加和的一半的背包中,尽量达到最大值。

  第一版:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include <math.h>
#define N 105
#define M 1000
using namespace std;

int main(){
    int n,v[N],dp[N][M],a,b,volume,sum;
    while( scanf("%d",&n)!=EOF  && n>0 ){
        volume=0;sum=1;
        for( int i=0;i<n;i++ ){
            scanf("%d%d",&a,&b);
            volume+=(a*b);
            while( b-- )//将单个物品依次加入
                v[sum++]=a;
        }
        sum--;
        //需要初始化dp中的全部值为0,下一次dp比较的值,上一次可能没有赋值,比较时将与负值(未初始化)进行比较,得到不正确的值
        //for( int i=0;i<volume;i++ )
        //    dp[0][i]=0;
        memset(dp,0,sizeof(dp));

        for( int i=1;i<=sum;i++ ){
            for( int j=v[i];j<=volume/2;j++ ){
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+v[i]);//转移方程
            }
        }
        printf("%d %d\n",max(dp[sum][volume/2],volume-dp[sum][volume/2]),min(dp[sum][volume/2],volume-dp[sum][volume/2]));
    }
    system("pause");
    return 0;
}

测试用例:

2

10 1

20 1

3

10 1

20 2

30 1

-1

  测试用例2答案是对的,用例1答案不对。因为对于用例1,20大于总价值一半(15),故dp值均为0,最后结果为0。为此,不妨使用优化版的dp,即使用一维数组dp,这样就算出现刚才的情况,较早的dp值即为答案。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include <math.h>
#define N 105
#define M 100000
using namespace std;

int main(){
    int n,v[N],dp[M],a,b,volume,sum;
    while( scanf("%d",&n)!=EOF  && n>0 ){
        volume=0;sum=1;
        for( int i=0;i<n;i++ ){
            scanf("%d%d",&a,&b);
            volume+=(a*b);
            while( b-- )//将单个物品依次加入
                v[sum++]=a;
        }
        sum--;
        //需要初始化dp中的全部值为0,下一次dp比较的值,上一次可能没有赋值,比较时将与负值(未初始化)进行比较,得到不正确的值
        memset(dp,0,sizeof(dp));

        for( int i=1;i<=sum;i++ ){
            for( int j=volume/2;j>=v[i];j-- ){
                dp[j]=max(dp[j],dp[j-v[i]]+v[i]);//转移方程
            }
        }
        printf("%d %d\n",max(dp[volume/2],volume-dp[volume/2]),min(dp[volume/2],volume-dp[volume/2]));
    }
    system("pause");
    return 0;
}
时间: 2024-10-19 11:06:56

HDU1171-Big Event in HDU的相关文章

HDU1171 Big Event in HDU 【母函数】

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22835    Accepted Submission(s): 8018 Problem Description Nowadays, we all know that Computer College is the biggest department

hdu1171 Big Event in HDU 01-背包

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171 Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever bee

HDU-1171 Big Event in HDU (多重背包)

Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Computer College and Software College in 2002.The splitting is absolutely a big

poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)

题目链接: poj3211  hdu1171 这个题目比1711难处理的是字符串如何处理,所以我们要想办法,自然而然就要想到用结构体存储,所以最后将所有的衣服分组,然后将每组时间减半,看最多能装多少,最后求最大值,那么就很愉快的转化成了一个01背包问题了.... hdu1711是说两个得到的价值要尽可能的相等,所以还是把所有的价值分为两半,最后01背包,那么这个问题就得到了解决.. 题目: Washing Clothes Time Limit: 1000MS   Memory Limit: 13

HDU1171--Big Event in HDU(多重背包)

Big Event in HDU   Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1139 Accepted Submission(s): 444 Problem Description Nowadays, we all know that Computer College is the biggest department in HD

HDU 1171 Big Event in HDU (多重背包变形)

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27961    Accepted Submission(s): 9847 Problem Description Nowadays, we all know that Computer College is the biggest department

hdu 1171 Big Event in HDU(母函数|多重背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意:有n种物品,给出每种物品的价值和数目,要将这些物品尽可能的分成相等的两份A和B且A>=B ,输出A,B. 母函数可以过,但感觉最直接的方法应该是多重背包. 母函数的话,也是按总价值的一半求,从一半到小枚举,直到找到系数不为0的就是B. #include <stdio.h> #include <iostream> #include <map> #include <

hdu 1171 Big Event in HDU

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22611    Accepted Submission(s): 7942 Problem Description Nowadays, we all know that Computer College is the biggest department

HDU 1171 Big Event in HDU --暴力+生成函数

题意:给n种房子,每种房子有一个值val和个数cnt,现在要把这些房子分成两部分,争取两部分总值相等,如果不能相等,让A>B,且A-B最小. 解法:先跑一次生成函数,c[n]表示组成总值为n的方法种数,然后从Total/2~0枚举B的总值,如果c[i]不为0,说明可以达到 i 这个状态,说明这就是B的最接近A的值(因为最接近Total/2).算法复杂度较高.跑了1600多ms,不知道还有没有更优的算法. 代码: #include <iostream> #include <cstdi

HDU 1171 Big Event in HDU(母函数或01背包)

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 44151    Accepted Submission(s): 15191 Problem Description Nowadays, we all know that Computer College is the biggest department