背包DP泛做

DP太弱了,要多做。

结果做了一堆傻逼题。。。

洛谷P2639:

01背包

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define max(a, b) (a < b ? b : a)
const int MAXN = 500;
using namespace std;

inline int read() {
    int x = 0, w = 1;
    char c = ‘ ‘;

    while (c < ‘0‘ || c > ‘9‘) {
        c = getchar();
        if (c == ‘-‘) w = -1;
    }
    while (c >= ‘0‘ && c <= ‘9‘) {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }

    return x * w;
}

int n, m, dp[45000 + 5], a[MAXN + 5];

void init() {
    m = read();
    n = read();

    for (int i = 1; i <= n; ++i)
        a[i] = read();
}

int main() {
    init();

    for (int i = 1; i <= n; ++i)
        for (int j = m; j >= a[i]; --j)
            dp[j] = max(dp[j - a[i]] + a[i], dp[j]);

    printf("%d\n", dp[m]);

    return 0;
}

洛谷P2722

#include <iostream>
#include <cstdio>
const int MAXN = 10000;
using namespace std;

inline int read() {
    int x = 0, w = 1;
    char c = ‘ ‘;

    while (c < ‘0‘ || c > ‘9‘) {
        c = getchar();
        if (c == ‘-‘) w = -1;
    }
    while (c >= ‘0‘ && c <= ‘9‘) {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }

    return x * w;
}

struct Node {
    int num, t;
}a[MAXN + 5];

int n, m, dp[MAXN + 5];

void init() {
    m = read();
    n = read();

    for (int i = 1; i <= n; ++i) {
        a[i].num = read();
        a[i].t = read();
    }
}

int main() {
    init();

    for (int i = 1; i <= n; ++i)
        for (int j = a[i].t; j <= m; ++j)
            dp[j] = max(dp[j - a[i].t] + a[i].num, dp[j]);

    printf("%d\n", dp[m]);

    return 0;
}

洛谷P2347:

多重背包,有bitset水法。

#include <iostream>
#include <cstdio>
#include <bitset>
const int MAXN = 1000;
using namespace std;

inline int read() {
    int x = 0, w = 1;
    char c = ‘ ‘;

    while (c < ‘0‘ || c > ‘9‘) {
        c = getchar();
        if (c == ‘-‘) w = -1;
    }
    while (c >= ‘0‘ && c <= ‘9‘) {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }

    return x * w;
}

int n = 6, m = 1000, dp[MAXN + 5];
int w[MAXN + 5] = {0, 1, 2, 3, 5, 10, 20}, a[MAXN + 5]; 

bitset < 1001 > S;

void init() {
    for (int i = 1; i <= n; ++i)
        a[i] = read();

    S[0] = 1;
}

int main() {
    init();

    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= a[i]; ++j)
            S |= S << w[i];

    printf("%d\n", S.count() - 1);

    return 0;
}

洛谷P2925:

#include <iostream>
#include <cstdio>
const int MAXN = 50000;
using namespace std;

inline int read() {
    int x = 0, w = 1;
    char c = ‘ ‘;

    while (c < ‘0‘ || c > ‘9‘) {
        c = getchar();
        if (c == ‘-‘) w = -1;
    }
    while (c >= ‘0‘ && c <= ‘9‘) {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }

    return x * w;
}

int n, m, dp[MAXN + 5];
int a[MAXN + 5];

void init() {
    m = read();
    n = read();

    for (int i = 1; i <= n; ++i)
        a[i] = read();
}

int main() {
    init();

    for (int i = 1; i <= n; ++i)
        for (int j = m; j >= a[i]; --j)
            dp[j] = max(dp[j - a[i]] + a[i], dp[j]);

    printf("%d\n", dp[m]);

    return 0;
}

洛谷P1910

#include <iostream>
#include <cstdio>
const int MAXN = 100;
using namespace std;

inline int read() {
    int x = 0, w = 1;
    char c = ‘ ‘;

    while (c < ‘0‘ || c > ‘9‘) {
        c = getchar();
        if (c == ‘-‘) w = -1;
    }
    while (c >= ‘0‘ && c <= ‘9‘) {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }

    return x * w;
}

struct Node {
    int a, b, c;
}a[MAXN + 5];

int dp[1000 + 5][1000 + 5], n, m, x;

void  init() {
    n = read();
    m = read();
    x = read();

    for (int i = 1; i <= n; ++i) {
        a[i].a = read();
        a[i].b = read();
        a[i].c = read();
    }
}

int main() {
    init();

    for (int i = 1; i <= n; ++i)
        for (int j = m; j >= a[i].b; --j)
            for (int k = x; k >= a[i].c; --k)
                dp[j][k] = max(dp[j - a[i].b][k - a[i].c] + a[i].a, dp[j][k]);

    printf("%d\n", dp[m][x]);

    return 0;
}

洛谷P1734

#include <iostream>
#include <cstdio>
const int MAXN = 1000;
using namespace std;

inline int read() {
    int x = 0, w = 1;
    char c = ‘ ‘;

    while (c < ‘0‘ || c > ‘9‘) {
        c = getchar();
        if (c == ‘-‘) w = -1;
    }
    while (c >= ‘0‘ && c <= ‘9‘) {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }

    return x * w;
}

int n, a[MAXN + 5], dp[MAXN + 5];

void init() {
    n = read();

    for (int i = 1; i <= n; ++i)
        for (int j = 1; j < i; ++j)
            if (i % j == 0) a[i] += j;
} 

int main() {
    init();

    for (int i = 1; i <= n; ++i)
        for (int j = n; j > i; --j)
            dp[j] = max(dp[j - i] + a[i], dp[j]);

    printf("%d\n", dp[n]);

    return 0;
}

原文地址:https://www.cnblogs.com/23forever/p/8971797.html

时间: 2024-10-11 16:56:15

背包DP泛做的相关文章

# 清北冬令营真题泛做

清北冬令营真题泛做 前言 这段时间为了准备冬令营把清北冬令营真题都做了一下.更个博回顾一下(免得你们老说我咕咕咕). 先写良心PKU的题再写THU的题, 主要是THU的题和PKU比起来真的毒瘤好多...... PKUWC2018 [PKUWC2018]Minimax 一个比较显然的暴力是归并排序,每次直接前后缀计算答案即可. 为啥不用线段树合并代替归并排序呢? 暴力线段树合并,合并的过程中顺便算一下即可,由于权值区间不交所以复杂度一个\(log\). [PKUWC2018]Slay the Sp

hdu1561:树形背包dp

给定n个地点,每个地点藏有cost[i]的宝物,取得某些宝物有时需要先取其他宝物,现在让我们选m个地点问最多可以选多少宝物? 还是挺裸的树形背包dp吧,不难,关键还是中间dp的部分.可以做模板了->_-> 注意点:多组数据的话如果第一组对了然后其他都错了,那么很有可能是初始化的时候漏了.这次找可很久才知道差了e[0].clear().平时的习惯都是从1开始. --------------------------------------------------------------------

背包DP HDOJ 5410 CRB and His Birthday

题目传送门 题意:有n个商店,有m金钱,一个商店买x件商品需要x*w[i]的金钱,得到a[i] * x + b[i]件商品(x > 0),问最多能买到多少件商品 01背包+完全背包:首先x == 1时,得到a[i] + b[i],若再买得到的是a[i],那么x == 1的情况用01背包思想,x > 1时就是在01的基础上的完全背包.背包dp没刷过专题,这么简单的题也做不出来:( /************************************************* Author

算法复习——背包dp

1.01背包 二维递推式子: 代码: for (i=1;i<=n;i++) for (x=m;x>=1;x--) if (x>=w[i]) f[i][x]=max(f[i-1][x-w[i]]+c[i],f[i-1][x]); else f[i][x]=f[i-1][x]; printf("%d",f[n][m]); // f(n,m)为最优解 return 0; 然而有时候,由于容量或者物品数过多可能导致用二维数组可能超空间,此时可以考虑一维的优化 用f[i]表示当

【bzoj3687】简单题 背包dp+STL-bitset

题目描述 小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和.2.子集的异或和的异或和.3.子集的算术和的算术和.4.子集的算术和的异或和.目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把这个问题交给你,未来的集训队队员来实现. 输入 第一行,一个整数n.第二行,n个正整数,表示01,a2….,. 输出 一行,包含一个整数,表示所有子集和的异或和. 样例输入 2 1 3 样例输出 6 题解 背包dp+STL-bitset 首先想想暴力怎么做?设

Cqoi2017试题泛做

Day1 4813: [Cqoi2017]小Q的棋盘 树形背包DP. 1 #include <cstdio> 2 3 #define maxn 110 4 #define R register 5 #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0) 6 struct Edge { 7 Edge *next; 8 int to; 9 } *last[maxn], e[maxn << 1], *ecnt = e; 10 inline

【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了保证团队的和谐,JYY需要保证,如果招募了候选人i,那么候选人Ri"也一定需要在团队中.当然了,JYY自己总是在团队里的.每一个候选人都有一个战斗值Pi",也有一个招募费用Si".JYY希望招募K个候选人(JYY自己不算),组成一个性价比最高的团队.也就是,这K个被JYY选择的候

【日常学习】【背包DP】codevs1155 金明的预算方案题解

题目来源:2006NOIPTG 题目描述 Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行".今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: <dl><dd> <colgroup><col width="

HAOI2010 软件安装 有依赖的背包DP

题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一 些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j).幸运的 是,一个软件最多依赖另外一个软件.如果一个软件不能正常工作,那么它能够发挥的作用为0. 我们现在知道了软件之间的依赖关系:软件i依赖软件Di.现在请你设计出