编程算法 - 背包问题(记忆化搜索) 代码(C)

背包问题(记忆化搜索) 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目参考: http://blog.csdn.net/caroline_wendy/article/details/37912949

使用记忆化搜索, 需要存储每组的值, 下次不需要进行继续迭代, 可以降低至时间复杂度O(nW).

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.7.17
 *      Author: spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>
#include <memory.h>
#include <limits.h>

#include <utility>
#include <queue>
#include <algorithm>

using namespace std;

class Program {
	static const int MAX_N = 100;

	int n=4, W=5;
	int w[MAX_N] = {2,1,3,2}, v[MAX_N]={3,2,4,2};
	int dp[MAX_N+1][MAX_N+1];

	int rec (int i, int j) {
		if (dp[i][j] >= 0) return dp[i][j];
		int res;
		if (i==n) {
			res = 0;
		} else if (j<w[i]) {
			res = rec(i+1, j);
		} else {
			res = max(rec(i+1,j), rec(i+1, j-w[i])+v[i] );
		}
		return dp[i][j] = res;
	}
public:
	void solve() {
		memset(dp, -1, sizeof(dp));
		printf("result = %d\n", rec(0, W));
	}
};

int main(void)
{
	Program P;
	P.solve();
    return 0;
}

输出:

result = 7

编程算法 - 背包问题(记忆化搜索) 代码(C)

时间: 2024-10-19 08:13:32

编程算法 - 背包问题(记忆化搜索) 代码(C)的相关文章

编程算法 - 背包问题(三种动态规划) 代码(C)

背包问题(三种动态规划) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目參考: http://blog.csdn.net/caroline_wendy/article/details/37912949 能够用动态规划(Dynamic Programming, DP)求解, 能够通过记忆化搜索推导出递推式, 能够使用三种不同的方向进行求解. 动态规划主要是状态转移, 须要理解清晰. 代码: /* * main.cpp * * Created o

由DAG到背包问题——记忆化搜索和递推两种解法

一.问题描述 物品无限的背包问题:有n种物品,每种均有无穷多个.第 i 种物品的体积为Vi,重量为Wi.选一些物品装到一个容量为 C 的背包中,求使得背包内物品总体积不超过C的前提下重量的最大值.1≤n≤100, 1≤Vi≤C≤10000, 1≤Wi≤1000000. 二.解题思路 我们可以先求体积恰好为 i 时的最大重量(设为d[i]),然后取d[i]中的最大值(i ≤ C).与之前硬币问题,"面值恰好为S"就类似了.只不过加了新属性--重量,相当于把原来的无权图改成带权图,即把&q

背包问题 (记忆化搜索)

使用记忆化搜索,可大大提升时间效率.... 1 int n,W;//n为重量 2 int w[MAX],v[MAX]; 3 int dp[MAX][MAX]; 4 5 //从第i个物品开始挑选总重小于j的部分 6 int rec(int i,int j) 7 { 8 //记忆化搜索 9 /*if(dp[i][j] >= 0){ 10 return dp[i][j]; 11 }*/ 12 int rec; 13 if(i==n){ 14 //已经没有剩余物品了 15 rec=0; 16 } 17

动态规划、记忆化搜索、Dijkstra算法的总结

动态规划 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这

HDU 1248寒冰王座-全然背包或记忆化搜索

寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13001    Accepted Submission(s): 6620 Problem Description 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,仅仅有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑

hdu 1142 A Walk Through the Forest (digkstra+记忆化搜索)

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7322    Accepted Submission(s): 2685 Problem Description Jimmy experiences a lot of stress at work these days, especial

LA3942 Remember the Word(字典树+记忆化搜索)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22109 题意:给出一个由S个不同单词组成的字典和一个长字符串.把这个字符串分解成若干个单词的连接(单词可以重复使用),由多少种方法?比如,有4个单词a,b,cd,ab,则abcd有两种分解方法:a+b+cd和ab+cd 分析:首先将输入的字典建成字典树.然后记忆化搜索~ 代码: #include <iostream> #include <cstring>

刷题总结——二叉苹果树(ssoj树形dp+记忆化搜索)

题目: 题目背景 URAL:http://acm.timus.ru/problem.aspx?space=1&num=1018 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说没有只有 1 个儿子的结点,这棵树共有N 个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置.下面是一颗有 4 个树枝的树:         2    5          \ /              3    4         

51nod 1455 宝石猎人(dp or 记忆化搜索)

苏塞克岛是一个有着30001个小岛的群岛,这些小岛沿着一条直线均匀间隔分布,从西到东编号为0到30000.众所周知,这些岛上有很多宝石,在苏塞克岛上总共有n颗宝石,并且第i颗宝石位于岛 pi上. 小法正好到达0号小岛上,他拥有卓越的跳跃能力,能根据以下规则在小岛之间向东重复跳跃: ·        首先,他会从0号岛跳到d号岛 ·        此后,他会根据以下规则继续跳跃,L是上一次跳跃的长度,即,如果他上一次跳跃是从岛prev岛cur,L= cur-prev.他可以向东做一次长度为L-1,