背包
芋智波佐助
菜鸟一只
展开
-
HDU 3466 Proud Merchants 需要排序的背包
和普通的01背包不一样,多了一个限制,只有在剩余钱大于等于q的时候才能选。需要确定先后顺序,假设有A, B2个物品并且他们都会选择,如果先选A再选B那么选第二个的时候花费至少是q1+p2,如果先选B再选A,选第二个的时候花费至少是q2+p1,所以应该排个序,满足q1+p2 < q2+p1,移项得到q1-p1 < q2-p2。 #include #include #include原创 2016-07-11 09:35:55 · 361 阅读 · 0 评论 -
HDU 3339 In Action 价值为最短路的背包
题目来源:HDU 3339 In Action 题意:有一个系统要去破坏 该系统是有n个点组成的图 每个点有一个权值 可以从0排除任意个机器人 去占领一个点 每个机器只能占领一个地方 所有机器人占领点的权值之和大于所有点权值之和的一半(不能等于) 就算破环成功 求在破坏的情况下所有机器人走过的路径之和最小 思路:简而言之 就是选出若干个点 他们的和大于总数的一半 并且走的路最短原创 2014-04-06 00:00:11 · 1242 阅读 · 0 评论 -
TOJ 3479 Four Gate Push /完全背包
Four Gate Push 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 You are working hard on your Protoss builds in StarCraft II, especially the 4 Gate Push. You've come upon a tough problem,原创 2013-08-20 14:33:25 · 1006 阅读 · 0 评论 -
TOJ 4365 ZOJ 3623 Battle Ships / 完全背包
Battle Ships 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 Battle Ships is a new game which is similar to Star Craft. In this game, the enemy builds a defense tower, which has转载 2013-11-11 15:53:56 · 915 阅读 · 0 评论 -
TOJ 1081 ZOJ 1149 HDU 1059 Dividing / 多重背包二进制优化
Dividing 时间限制(普通/Java):1000MS/10000MS 运行内存限制:65536KByte 描述 Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal s原创 2013-10-19 11:09:11 · 1562 阅读 · 0 评论 -
UVa 10280 Old Wine Into New Bottles / 完全背包
转自http://blog.csdn.net/yan_____/article/details/8671147 1、这道题如果直接把每个酒瓶的可用容量来做完全背包的话会超时,但是由最低的容量不低于95%,最高的容量不超过99%,由于容量的连续性有一些规律可循,可藉此优化: 考虑任意一种瓶子能够将酒全装满的情况,最小容量min,最大容量max,只要酒的体积x在[min,max]|[2*mi转载 2013-12-05 18:00:59 · 918 阅读 · 0 评论 -
POJ 2063 Investment / 体积变大的完全背包
完全背包 体积都是1000的倍数 所以可以除以1000 可能你会想价值是1000的倍数啊 这没关系 买股票 买x元的股票1年可以增加y元 现在总共有m元 求k年后 最多有多少钱 每年做一次完全背包 #include #include #include using namespace std; const int maxn = 100010; int dp[maxn]; int a[原创 2014-03-28 17:40:31 · 1210 阅读 · 0 评论 -
POJ 2392 Space Elevator / 体积不定的多重背包
对于体积不变 可以先排个序 这样对于体积大的物品 转移时比他小的状态都算出来了 #include #include #include using namespace std; const int maxn = 444; struct block { int a, b, c; }a[maxn]; int dp[maxn*100]; bool cmp(block a, block b)原创 2014-03-19 12:43:21 · 860 阅读 · 0 评论 -
HDU 2639 Bone Collector II / 第K大的01背包
第k大可以多加一维状态 对于第i个物品 每次求出不放这个物品的时候 第1到第k大的数 就是上一维的情况 再求出放这个物品时候第1到第k大的数 得到2*k个价值 求出2*k个数中最大的k个 然后题目要求严格递减 不能一样 #include #include const int maxn = 110; int dp[maxn][maxn*10][33]; int a[maxn], b[max原创 2014-03-18 16:24:22 · 1019 阅读 · 0 评论 -
HDU 3033 I love sneakers! / 分组背包
有k类物品 至少每种选一个 求最大价值 考虑只有一类物品 那么就是01背包了 现在k类 那就多加一维好了 dp[i][k] = max(max(dp[i][k], dp[i][k-x]+y), dp[i-1][k-x]+y); #include #include #include #include using namespace std; const int maxn = 110;原创 2014-03-20 12:43:08 · 990 阅读 · 0 评论 -
POJ 1837 Balance / 分组背包
n个位置放m个砝码 求天平的平衡有几种方案 分组背包 每个物品是一个组 总个m个物品m组 每个组有n个 因为每个物品可以在n个位置中任何一个 此外这题又是与负数 还是平移 可以滚动 因为不卡内存 所以没写滚动 写滚动还要考虑正负 #include #include #include const int maxn = 30; int a[maxn], b[maxn]; int dp[m原创 2014-03-20 15:56:36 · 1063 阅读 · 0 评论 -
POJ 1787 Charlie's Change / 完全背包
多重背包 不过用完全背包来做 加个判断当前硬币的数量是否超过限制 还有就是打印路径 觉得打印路径都差不多 UVa打印路径的题目很多 要是字典序要求就更高了 #include #include using namespace std; const int maxn = 10010; int dp[maxn], num[maxn], p[maxn]; int a[10]; int b[10]原创 2014-03-28 11:24:56 · 1024 阅读 · 0 评论 -
POJ 3260 The Fewest Coins / 混合背包
给钱+找钱花的硬币最少 给钱多重背包 找钱01背包 然后背包上限不知道 据说是抽屉原理 我还没学过 然后有空在学 多重背包我用2进制优化 01背包 以为是要在多重背包的基础上减 背包的价值是负数所以 我是倒过来处理的 #include #include #include using namespace std; const int maxn = 130; const int max原创 2014-03-28 13:38:31 · 995 阅读 · 0 评论 -
ZOJ 1163 The Staircases / 01背包
每个物品选一次 完全背包 #include #include const int maxn = 510; double dp[maxn]; int main() { memset(dp, 0 ,sizeof(dp)); dp[0] = 1; for(int i = 1; i <= 500; i++) { for(int j = 500; j >= i; j--) { d原创 2014-03-30 15:47:53 · 1170 阅读 · 0 评论 -
TOJ 4367 ZOJ 3631 Watashi's BG / 背包 深搜
Watashi's BG 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 Watashi is the couch of ZJU-ICPC Team and he is very kind hearted. In ZJU-ICPC summer training camp, students are divided原创 2013-10-19 10:04:42 · 1191 阅读 · 0 评论 -
UVa 10404 Bachet's Game / 完全背包
一堆石头 取完最后一个的胜利 m种取法 完全背包变形 dp[i] = true表示先守取第i个可达 dp[n] = true先手胜 否则输 #include #include #include #include using namespace std; bool dp[1000001]; int n,m,a[11]; int main() { int i,j; while(sca原创 2013-12-05 10:21:59 · 934 阅读 · 0 评论 -
POJ 1742 Coins 多重背包
dp[i][j]为用了前i种硬币,得到j,最多还剩下i种硬币多少个。 dp[n][x] >= 0说明可以达到x。 #include #include const int maxn = 110; const int maxm = 100010; int a[maxn], b[maxn]; int dp[maxm]; int main() { int n, m; whil原创 2016-07-18 09:03:47 · 253 阅读 · 0 评论