HDU 1171 Big Event in HDU(0-1背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1171

题意:给出一系列的价值,需要平分,并且尽量接近。

思路:0—1背包问题。

0-1背包问题也就是有n种物品且每种只有一个。第i个物品的体积为vi,重量为wi。选择一些物品装到背包中,使得体积不超过背包的前提下重量尽可能大。

用f(i,j)表示“把前i个物品装到容量为j的背包中的最大总重量,其状态转移方程就是:

f(i,j)=max{ f(i-1,j),f(i-1,j-v[i])+w[i] }

所以在第i个物品的时候,我们需要判断是装还是不装,f(i-1,j)是不装,f(i-1,j-v[i])+w[i] 代表把第i件装入背包后得总价值,比较两者的大小,选择价值大的存入现在的背包。

f(i-1,j-v[i])是指当把前i件物品装入一个容量为j-v[i]大小的背包中的最大总重量。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 int v[5010];
 7 int dp[300000];
 8
 9 int main()
10 {
11     //freopen("D:\\txt.txt", "r", stdin);
12     int n,a,b;
13     while (cin >> n && n > 0)
14     {
15         memset(v, 0, sizeof(v));
16         memset(dp, 0, sizeof(dp));
17         int k = 0;
18         int sum = 0;
19         for (int i = 0; i < n; i++)
20         {
21             cin >> a >> b;
22             while (b--)
23             {
24                 v[k++] = a;
25                 sum += a;
26             }
27         }
28         for (int i = 0; i < k; i++)
29         {
30             for (int j = sum / 2; j >= v[i]; j--)
31                 dp[j] = max(dp[j], dp[j - v[i]] + v[i]);
32         }
33         cout << sum - dp[sum / 2] << " " << dp[sum / 2] << endl;
34     }
35     return 0;
36 }
时间: 2024-08-28 17:45:09

HDU 1171 Big Event in HDU(0-1背包)的相关文章

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(母函数)

链接:hdu 1171 题意:这题可以理解为n种物品,每种物品的价值和数量已知,现要将总物品分为A,B两部分, 使得A,B的价值尽可能相等,且A>=B,求A,B的价值分别为多少 分析:这题可以用母函数的思想解,不过求的不是方案数,而是判断尽可能接近总价值的一半的方案是否存在. 也可以用背包思想,每种物品的价值和数量已知,可以将总价值的一半作为容量,求最大价值,也就最接近所求值了 注:数组要开的稍微大一点,否则可能WA #include<stdio.h> #include<strin

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): 22623    Accepted Submission(s): 7948 Problem Description Nowadays, we all know that Computer College is the biggest department

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(母函数或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

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): 31928    Accepted Submission(s): 11169 Problem Description Nowadays, we all know that Computer College is the biggest departmen

组合数学 - 母函数的变形 --- 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): 24002    Accepted Submission(s): 8458 Problem Description Nowadays, we all know that Computer College is the biggest department

HDU 1171 Big Event in HDU(01背包)

题目地址:HDU 1171 还是水题..普通的01背包.注意数组要开大点啊.... 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include &