
背包问题
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
制造游戏币
题目链接:制造游戏币这个其实就是有多条链的关系。所以我们肯定是提前先把物品拿到合法:也就是对于一条链来说,先拿 0 1 2 3 4 …个。然后每次就相当于可以拿一个后缀的所有物品。然后背包dp即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10原创 2021-10-24 20:33:27 · 2012 阅读 · 0 评论 -
Codeforces - Sum
题目链接:Codeforces - Sum我们可以发现一个结论,不可能有多个同时只选了一个不完全的前缀。也就是如果对于某一类物品,我们选了前几个,未选完。另一种物品不可能也是只选了前几个,未选完。因为物品价值是单调递增的,一定可以选某一个选更多使得答案更优。所以我们枚举每一类选了几个即可,然后要维护不选这个物品的最大价值。直接分治背包即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/std原创 2020-12-02 15:31:29 · 310 阅读 · 0 评论 -
Codeforces - Lucky Country
题目链接:Codeforces - Lucky Country对联通块做背包即可。最坏复杂度是 sqrt(n) * n * logw的,并且logw很小为常数。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int n,m,dp[N],cnt[原创 2020-09-03 23:58:10 · 564 阅读 · 0 评论 -
HDU - 5410
题目链接:HDU - 5410因为B为正,所以我们可以将一个物品拆成两个,一个价值为a+b的单一物品,一个价值为a的完全物品。然后两次背包即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e3+10;int n,m,w[N],a[N],b[N],dp[原创 2020-08-13 23:08:41 · 248 阅读 · 0 评论 -
Codeforces - Porcelain
题目链接:Codeforces - Porcelain很显然的dp。类似于一个分组背包。dp[i][j]为前i组,摔了j次,然后随便枚举转移一下即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=110,M=10010;int n,m,dp[N][M],原创 2020-06-23 17:15:11 · 228 阅读 · 0 评论 -
看球泡妹子
题目链接:看球泡妹子显然的二维费用背包。把小红的当做体积,把能看的场数当做质量,小明的当做价值做背包。因为我们要得到刚好体积为某个值,场数为某个值的价值,所以提前全面赋值为-INF。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e2+10;int n,原创 2020-05-11 11:27:28 · 181 阅读 · 0 评论 -
Codeforces - Modulo Sum
题目链接:Codeforces - Modulo Sum显然,只要相同的前缀余数相同,那么就是YES。根据抽屉原理,当n>m时,必然存在。所以对n<1e3的时候做背包即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int ...原创 2020-03-20 14:35:26 · 274 阅读 · 0 评论 -
烛光晚餐
题目链接:烛光晚餐把小明的值也当成费用,总体增加一个值,做二维背包即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;int n,v,dp[510][1020],res;...原创 2020-03-19 19:48:40 · 144 阅读 · 0 评论 -
消失之物
题目链接:消失之物直接暴力背包是不行的。然后考虑对每一个物品做一次退背包即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e3+10;int...原创 2020-03-18 16:59:02 · 196 阅读 · 0 评论 -
Codeforces - Arpa's weak amphitheater and Mehrdad's valuable Hoses
题目链接:Codeforces - Arpa’s weak amphitheater and Mehrdad’s valuable Hoses因为一组里面要么全选,要么只选一个。不就是分组背包吗?用并查集维护一下组的集合即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++....原创 2020-03-05 13:51:07 · 200 阅读 · 0 评论 -
虚无的后缀
题目链接:虚无的后缀首先0的个数只和2与5的个数有关。所以我们处理出每个数字有多少个2以及有多少个5。然后对于每个数字就是取不取的问题,可以想到01背包。我们把5当质量,2当价值做背包即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define in...原创 2020-02-14 20:04:46 · 255 阅读 · 0 评论 -
小Z的游戏分队
题目描述小Z受不了寂寞,准备举办一次DOTA比赛,为了能让ACM班全部都参加比赛,他还特制了一张DOTA地图能够支持任意多人打任意多人。现在问题来了,怎么把这么多人分成两队?小Z的想法是,每个人报上自己愿意同队的同学,接着小Z会按如下要求将所有人分为两队:对任意同学甲,和同学甲同队的人,必须都是同学甲愿意同队的同学。小Z希望两队的人数差尽量小,如果这种分组不存在,那么输出No soluti...原创 2020-01-10 18:41:45 · 475 阅读 · 0 评论 -
背包问题拓展
这篇博客主要讲解当背包装满时,使得背包总价值最小的方案。这个问题主要涉及到两个问题。背包必须装满。总价值最小以前的背包都是体积最大是多少时,总价值多大。并不一定要装满。那,我们怎么解决呢?我们让dp赋值为INF(最大值),dp[0]为1,这样每次状态转移时,都求最小值,我们就可以保证每次的转移都是由dp[0]转移过来,就可以确定是刚好体积为v的时候的最小价值。#include&l...原创 2019-04-09 12:59:05 · 344 阅读 · 0 评论 -
背包问题
这篇博客主要讲解3个比较简单的背包问题01背包问题完全背包问题多重背包问题01背包问题01背包就是有n个物品,你有一个背包可以装体积和为v的物品,同时每个物品都具有价值和体积且只有一件,让你在背包可以装得下的情况下,获得最大的价值。我们对于每一个物品都有两种决策,装和不装这个物品。同时我们用 dp[i][j] 表示前 i 个物品,体积为 j 的最大价值。那么 dp[n][v] ...原创 2019-04-08 23:05:50 · 261 阅读 · 0 评论