背包dp
帐下幕僚
我只是一个普普通通的大学学生,我来到这里是想获得我在学校所不能得到的知识。
展开
-
hdu2955 robberies题解(01背包)
注意要先转换成不被抓的概率再来算 状态转移方程money[k]=max(money[k],money[k-M[i]]*p[i])//这里的p[i]是不被抓的概率。#include <stdio.h>#include <string.h>#define Max(X,Y) ((X)<(Y)?(Y):(X))double money[10050];int main(int argc, char原创 2016-05-30 22:48:45 · 279 阅读 · 0 评论 -
hdu2602题解bone collector(01背包)
这是我做的第一道背包问题,推荐背包九讲,经典!!! 状态转移方程: f[i][vi]=maxx(f[i-1][vi],f[i-1][vi-vo[i]]+va[i]) 这是直接由状态转移方程推出的代码(网上很少见到,但初学者容易理解),内存上可以进行优化#include <stdio.h>#include <string.h>#define maxx(X,Y) ((X)>(Y)?(X):(Y)原创 2016-05-30 23:13:12 · 320 阅读 · 0 评论 -
hdu2063investment题解(完全背包)
这道题需要一个小技巧,由于所有的value都是multiple of 1000,所以将总钱数除以1000,每个value除以1000,将dp数组的大小降下来 #include <stdio.h>#include <string.h>#define bttm 1000#define M(X,Y) ((X)>(Y)?(X):(Y))int bond1[12];int dp[50050],b原创 2016-05-30 22:59:53 · 343 阅读 · 0 评论 -
hdu1114Piggy-Bank题解(完全背包)
这是一道简单的完全背包问题,套模板就可以a了。#include <stdio.h>#define INF 29999999#define mmin(X,Y) ((X)<(Y)?(X):(Y))int n,p[510],w[510],f[10510];int main(int argc, char const *argv[]){ int t,i,j,ep,fp,nw; sca原创 2016-05-30 22:54:16 · 406 阅读 · 0 评论 -
hdu3535AreYouBusy(分组背包问题)
常见的有三种, 一,每组最多取一个, 一维数组的伪代码 for 所有的组k for v = V to 0 for 所有的i属于组k f[v] = max{f[v], f[v -c[i]] + w[i]} 注意顺序不能写反,因为要限制每组最多取一个 二,每组任意取 既然上面的顺序是限制每组最多取一个,那调换一下顺序即可,其实就是01原创 2016-08-23 22:56:49 · 324 阅读 · 0 评论 -
poj1360(完全背包+多重背包+鸽巢原理)
题意,fj去买价格为t的物品, shopkeeper只接受n种货币,价值分别vi,对于每种货币fj有ci个,但 shopkeeper都有无数个这种货币。求最少使用多少货币完成交易。 对于fj,进行一次多重背包, 对 shopkeeper,进行一次完全背包。 最重要的是要考虑上界, 鸽巢原理: fj最多支付maxv*maxv+t, shopkeeper最多找零maxv *maxv。 证明:原创 2016-08-24 11:38:13 · 441 阅读 · 0 评论