HDU 1171Big Event in HDU(转01背包)

题意:

给你一组数,分成差距最小的两份A,B(A>=B)

分析:

转01背包

注意:

01背包用一维数组

不要用二维

  二维数组若是开太大,内存超限,开太小,RE

#include "cstdio"
#include "cmath"
#include "cstring"
#include "iostream"
#include "algorithm"
using namespace std;
#define LL long long
#define N 250002
int dp[N];
int v[N];
int solve(int num,int W)
{
    for(int i = 0;i < num;i++)
    {
        for(int j = W;j >= v[i];j--)
        {
            dp[j] = max(dp[j],dp[j-v[i]]+v[i]);
        }
    }
    return dp[W];
}
int main()
{
    int t;
    while(scanf("%d",&t),(t>0))
    {
        memset(dp,0,sizeof(dp));
        memset(v,0,sizeof(v));
        int num=0,sum=0;
        int v1,n1;
        while(t--)
        {
            scanf("%d%d",&v1,&n1);
            for(int i=0;i<n1;i++)
            {
                v[num++]=v1;
                sum+=v1;
            }
        }
        int W=sum/2;
        int s=solve(num,W);
        printf("%d %d\n",sum-s,s);
    }
    return 0;
}
时间: 2024-10-19 13:33:08

HDU 1171Big Event in HDU(转01背包)的相关文章

多重背包之 HDU -1171Big Event in HDU &amp;HDU -2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

这两道题都是多重背包的基础题,前面的安格题意是:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B,就类似于NYOJ上的那个邮票分你一半那个意思,只不过这里不是一个而是多个,所以多重背包 前一个题是将总和的一半当作背包的容量来求,代码如下 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 int dp[1

Hdu 1171Big Event in HDU

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 41300    Accepted Submission(s): 14208 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): 24538    Accepted Submission(s): 8632 Problem Description Nowadays, we all know that Computer College is the biggest department

HDU 3033 I love sneakers! (01背包+反分组背包)

题意:给你 n,m,k,表示有k种鞋子共n双,你有m的容量: 每双鞋子有容量p和价值v:问是否买全k种鞋子,若能在容量为m的情况下最多能买到鞋子的价值为多少: 每双鞋子只能买一次(01背包),每种鞋子至少买一种(分组背包:每组只能有一个)与传统分组背包的限制相反. 注意初始化!!! #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map&g

hdu 4044 GeoDefense (树形dp+01背包)

GeoDefense Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 663    Accepted Submission(s): 267 Problem Description Tower defense is a kind of real-time strategy computer games. The goal of towe

hdu 5410 CRB and His Birthday 01背包和完全背包

#include<stdio.h> #include<string.h> #include<vector> #include<queue> #include<algorithm> using namespace std; int main() { int _,i,j,m,n,k,a[1024],b[1024],w[1024],dp[2048]; scanf("%d\n",&_); while(_--) { scanf(

hdu 1203 I NEED A OFFER (0-1背包)

题意分析:0-1背包变形  递推公式:dp[i] = max(dp[i], 1-(1-dp[i-C])*(1-p)) /* I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17860 Accepted Submission(s): 7152 Problem Description Speakless很早就想出国

HDU 1864 最大报销额 (01 背包)

最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16644    Accepted Submission(s): 4858 Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价

HDU 3496 (二维费用的01背包) Watch The Movie

多多想看N个动画片,她对这些动画片有不同喜欢程度,而且播放时长也不同 她的舅舅只能给她买其中M个(不多不少恰好M个),问在限定时间内观看动画片,她能得到的最大价值是多少 如果她不能在限定时间内看完买回来的动画片,则输出0 这里借用大牛的背包九讲的讲义,讲的很清楚 问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价值.设这两种代价分别为代价1和代价2,第i件物品所需的两种