dp
alfredtofu
这个作者很懒,什么都没留下…
展开
-
hdoj 1003 Max Sum
再次鄙视一下hdoj的评测系统。。做这个花了我半个小时,原因:第一次提交WA,我死找问题,没找出,然后百度,发现原理都一样,然后又看,又想,结果把代码再交一次。。AC。。完全没修改。。。//转移方程:ans[i] = max(a[i], ans[i - 1] + a[i]);#include #include #include #include using namespace std;struct node { int sum; int _beg; int _end;原创 2011-02-12 18:13:00 · 454 阅读 · 0 评论 -
poj 2392 Space Elevator 多重背包
为什么我那种循环找最大就会出错。按道理最高且不为0的元素就是最大的吧?求指点#include #include #include #include using namespace std;struct node { int h; int c; int a;}data[400];int f[40001];bool cmp(const node& A, const node& B) { if(A.a == B.a) return A.h > B.h; retu原创 2011-02-19 13:22:00 · 524 阅读 · 0 评论 -
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 多重背包
<br />中国加油!四川加油!<br />#include <iostream>#include <cmath>#include <cstring>using namespace std;int f[101]; //物品组int n, m;int ans[32001];int p, h, c;int count, sum;int main() { //freopen("1.txt", "r", stdin); int t; cin原创 2011-02-20 11:59:00 · 968 阅读 · 0 评论 -
hdu 1248 寒冰王座 完全背包
#include #include #include using namespace std;int a[3] = {150, 200, 350};int f[10001];int main() { //freopen("1.txt", "r", stdin); int t; cin >> t; while(t--) { int n; cin >> n; memset(f, 0, sizeof(f)); for(int i = 0; i f[原创 2011-02-18 08:38:00 · 573 阅读 · 0 评论 -
poj 3628 Bookshelf 2 01背包
<br />//f[i]表示能达到i高度的由牛组成的最小高度//f[i] = min(f[i], f[i - h] + h) h <= i <= b// min(f[i], h) 0 <= i < h#include <iostream>#include <cmath>#include <cstring>using namespace std;int f[120001];int n, b;int data[6];int main() { freo原创 2011-02-18 16:35:00 · 843 阅读 · 0 评论 -
poj 3260 the fewest coins
<br />那个给钱上限是百度的,原来我是用所有的价值加起来作为上线,结果TLE<br />背包问题都很简单,不过加上优化就可能难一点了<br /> <br />//f1[i]表示支付i元所需的最小硬币数//f2[i]表示找i元所需的最小硬币数//买T元东西所需的最小硬币数为f1[T + i] - f2[i]//f1[i] = min(f1[i], f1[i - k] + 1)//f2[i] = min(f2[i], f2[i - k] + 1)//其中f1[i]多重背包,用二进制拆分求原创 2011-02-19 09:51:00 · 1209 阅读 · 0 评论 -
hdu 2602 Bone Collector 01背包
<br />#include <iostream>#include <cmath>#include <cstring>#include <algorithm>using namespace std;struct node { int volume; int value;}data[1000];int f[1001];int main() { //freopen("1.txt", "r", stdin); int t; cin >> t; while(t原创 2011-02-19 13:54:00 · 551 阅读 · 0 评论 -
poj 1882 Stamps 二维费用背包
//f[i][l][k]表示第i组数,话费l或l个以下的邮票可达到k价值//f[i][l][k] = f[i][l][k] | f[i][l - 1][k - a[i][j]] || f[i][l - 1][k];#include #include #include #include using namespace std;bool f[10][11][1001];int n;int d[10];int a[10][10];int _max[10];int _原创 2011-02-19 15:53:00 · 896 阅读 · 0 评论 -
hdu 3721 Ahui Writes Word 多重背包
<br />刚开始是用01背包做,TLE,百度,发现这是多重背包。<br />ps:二进制拆分要熟练一点!!<br />#include <iostream>#include <cmath>#include <cstring>#include <cstdio>using namespace std;int f[10001];int n, c;int a[11][11];int main() { //freopen("1.txt", "r", stdin); c原创 2011-02-18 13:05:00 · 783 阅读 · 0 评论 -
poj 1948 Triangular Pastures 01背包
<br />其实,之前说背包简单,现在就觉得不是。。郁闷<br />怎么表示状态还是不简单啊。。这就是所谓的dp的难点?<br />//用f[i][j][k]表示到第i根木棒能否摆出边长分别为j,k的三角形//01背包//f[i][j] = f[i - len][j] | f[i][j - len]#include <iostream>#include <cmath>#include <cstring>using namespace std;bool f[801][801];原创 2011-02-19 11:48:00 · 1174 阅读 · 1 评论 -
sicily 1346 金明的预算方案 有依赖的背包问题
<br /><br />他还从因特网上查到了每件物品的价格(都是10元的整数倍)注意这句话就ok了。。之间没留意,结果TLE<br />#include <iostream>#include <cmath>#include <cstring>using namespace std;struct node { int v; //价格 int p; //重要度 int q; //所属主件的编号}data[61];int f[60][32001];原创 2011-02-20 11:32:00 · 2037 阅读 · 0 评论 -
poj 1014 Dividing 多重背包 二进制拆分
方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为1,2,4,...,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。其实就是拆分成所有的和加起来等于n[i];拆分后别忘了加权,即乘以价值。#include #include #include using namespace std;int f[120原创 2011-02-18 11:07:00 · 2276 阅读 · 0 评论 -
poj 2063 Investment 完全背包
//dp完全背包//f[i] = max(f[i], f[i - value] + interest);//注意预处理每个value,由于他们都是1K的倍数,故都除以1K,//不处理会超时。#include #include #include using namespace std;struct node { int value; int interest;}data[10];int f[50000];int main() { //freopen("1原创 2011-02-18 08:29:00 · 605 阅读 · 0 评论 -
sicily 2014 完全背包
<br />#include <iostream>#include <cstring>using namespace std;int f[301];int n, c;int main() { while(cin >> n >> c) { memset(f, 0, sizeof(f)); f[0] = 1; for(int i = 0; i < c; i++){ int tmp; cin >> tmp; for(int j = tmp; j <原创 2011-02-17 10:07:00 · 831 阅读 · 0 评论 -
sicily 1421 搬寝室
<br />//虽然看着dp的ppt,但是刚开始做还是用了深搜,毫无疑问,TLE//想着不对路,但是想不到怎么用dp,百度,搜到了转移方程://分两种情况//当i-1>=j*2时//b[i][j]=min{b[i-1][j], b[i-2][j-1]+(a[i]-a[i-1])^2} .//当i-1<j*2时//b[i][j]=b[i-2][j-1]+(a[i]-a[i-1])^2 .#include <iostream>#include <cstring>#includ原创 2011-02-15 09:36:00 · 365 阅读 · 0 评论 -
hdoj 1176 免费馅饼
<br />//转移方程:ans[t][x] = a[t][x] + max(ans[t - 1][x - 1], ans[t - 1][x], ans[t - 1][x + 1])//关键处理开始的几秒#include <iostream>#include <cstring>#include <algorithm>#include <string>#include <cstdio>using namespace std;int ans[100010][11];int a原创 2011-02-12 19:09:00 · 442 阅读 · 0 评论 -
FatMouse's Speed
<br />http://acm.hdu.edu.cn/showproblem.php?pid=1160<br /> <br />用类似求最长不减子序列的方法,比较水,转移方程为:f[n] = max(f[n], f[i] + 1)-----满足w[n] > w[i] && s[n] < s[i];<br />刚开始WA了几次,因为没注意到是严格单调增的<br />#include <iostream>#include <cstring>#include <algorithm>using nam原创 2011-02-12 16:50:00 · 532 阅读 · 0 评论 -
hdoj 1159 Common Subsequence
//根据LCS的最优子结构定理可得转移方程/* 0 i == 0 || j == 0len[i][j] = len[i - 1][j - 1] + 1 s1[i] == s2[j] max(len[i - 1][j], len[i][j - 1]) s1[i] != s2[j] */#include #include #include #include using namespace std;int len[1000][1000];原创 2011-02-12 17:23:00 · 532 阅读 · 0 评论 -
hdoj 1087 Super Jumping! Jumping! Jumping!
//转移方程:ans[i] = max(a[i], ans[j] + a[i]) j #include #include #include using namespace std;int ans[1010];int a[1010];int n;int main() { //freopen("1.txt", "r", stdin); while(cin >> n && n != 0) { for(int i = 1; i > a[i]; ans[i]原创 2011-02-12 18:33:00 · 456 阅读 · 0 评论 -
hdoj 1058 Humble Numbers
WA两次,一次没判重,一次不会序数词的定义。。。#include using namespace std;int a[4];int b[4] = {2, 3, 5, 7};int ans[5842];int main() { //freopen("1.txt", "r", stdin); for(int i = 0; i原创 2011-02-15 10:19:00 · 684 阅读 · 1 评论 -
hdu 2159 FATE
<br />本来这题我一直用int f[101][101]; //表示杀掉n只怪得到经验后剩下的忍耐度后来得到钟大牛指点,才发现我自己对背包的概念完全不理解,背包的价值、容量,这题,应该是经验是价值,忍耐度是容量,因为忍耐度是有限的,而经验是无限的。<br />还是高中数学老师彭清华那句话:“概念要清晰!!”<br /> <br />//f[i][j] = max(f[i][j], f[i - 1][m - b] + a)//f[i][j]表示杀掉i只怪用掉j忍耐度所能获得最大的经验值#includ原创 2011-02-17 23:12:00 · 574 阅读 · 0 评论 -
poj 1384 Piggy-Bank 完全背包
#include #include #include using namespace std;int f[10001];int E, F;int main() { //freopen("1.txt", "r", stdin); int t; cin >> t; while(t--) { cin >> E >> F; int weigh = F - E; for(int i = 0; i > n; while(n--) { int p,原创 2011-02-18 09:04:00 · 645 阅读 · 0 评论 -
poj 1252 zoj 1558 Euro Efficiency 完全背包
<br />雷同poj 3260<br />//看不懂题目,百度,发现题意如此,完全背包,计算方案数//大意:六种货币,面值都小于100。用这六种货币(可加可减)//用最少的货币数组成1到100。求出这1到100中最大的,并求平均值。#include <iostream>#include <cmath>#include <cstring>#include <cstdio>using namespace std;const int INF = 20000000;const原创 2011-02-19 10:36:00 · 1611 阅读 · 1 评论 -
hdu 2844 Coins 多重背包
#include #include #include using namespace std;struct node { int a; int c;}data[100];bool f[100001]; int n, m;int ans[32001];int p, h, c;int count, sum;int main() { //freopen("1.txt", "r", stdin); while(cin >> n >>原创 2011-02-20 12:17:00 · 606 阅读 · 0 评论 -
sicily 1176 Two Ends dp(记忆化搜索)
#include #include #include using namespace std;int n;int num[1001];int sum;int f[1001][1001];int dp(int beg, int end) { if(f[beg][end] == 0) { if(beg == end - 1) //剩下两个数的时候真的要贪心了 return f[beg][end] = max(num[beg], num[end]); //原创 2011-02-24 13:28:00 · 2255 阅读 · 1 评论