编程算法 - 背包问题(三种动态规划) 代码(C)
背包问题(三种动态规划) 代码(C)
本文地址: http://blog.csdn.net/caroline_wendy
题目參考: http://blog.csdn.net/caroline_wendy/article/details/37912949
能够用动态规划(Dynamic Programming, DP)求解, 能够通过记忆化搜索推导出递推式, 能够使用三种不同的方向进行求解.
动态规划主要是状态转移, 须要理解清晰.
代码:
/*
* 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]; //默认初始化为0
public:
void solve() {
for (int i=n-1; i>=0; i--) {
for (int j=0; j<=W; ++j) {
if (j<w[i]) {
dp[i][j] = dp[i+1][j];
} else {
dp[i][j] = max(dp[i+1][j], dp[i+1][j-w[i]] + v[i]);
}
}
}
printf("result = %d\n", dp[0][W]);
} void solve1() {
for (int i=0; i<n; ++i) {
for (int j=0; j<=W; ++j) {
if (j<w[i]) {
dp[i+1][j] = dp[i][j];
} else {
dp[i+1][j] = max(dp[i][j], dp[i][j-w[i]]+v[i]);
}
}
}
printf("result = %d\n", dp[n][W]);
} void solve2() {
for (int i=0; i<n; i++) {
for (int j=0; j<=W; ++j) {
dp[i+1][j] = max(dp[i+1][j], dp[i][j]);
if (j+w[i]<=W) {
dp[i+1][j+w[i]] = max(dp[i+1][j+w[i]], dp[i][j]+v[i]);
}
}
}
printf("result = %d\n", dp[n][W]);
}
}; int main(void)
{
Program P;
P.solve2();
return 0;
}
输出:
result = 7
节省空间, 能够使用1维数组的动态规划.
代码:
/*
* 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];
public:
void solve() {
memset(dp, 0, sizeof(dp));
for (int i=0; i<n; ++i) {
for (int j=W; j>=w[i]; --j) {
dp[j] = max(dp[j], dp[j-w[i]]+v[i]);
}
}
printf("result = %d\n", dp[W]);
}
}; int main(void)
{
Program P;
P.solve();
return 0;
}
输出:
result = 7
编程算法 - 背包问题(三种动态规划) 代码(C)的更多相关文章
- MVC3中,在control里面三种Html代码输出形式
MVC3中,在control里面三种Html代码输出形式:ViewData["msg"] = "<br /> Title <br />" ...
- K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比
一.概述 在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别. 首先需要明确 ...
- 详解Spring面向切面编程(AOP)三种实现
一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善. ...
- MVC-AOP(面向切面编程)思想-Filter 三种注册方式
在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter.IActionFilter.IResultFilter.IExceptionFil ...
- shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法
shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...
- 编程算法 - 食物链 并查集 代码(C)
食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种 ...
- 编程算法 - 篱笆修理(Fence Repair) 代码(C)
篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 分割的开销是木板长度, ...
- 编程算法 - 不用加减乘除做加法 代码(C)
不用加减乘除做加法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 写一个函数, 求两个整数之和, 要求在函数体内不得使用+, -, *, /四 ...
- 编程算法 - 推断二叉树是不是平衡树 代码(C)
推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结 ...
随机推荐
- springboot 使用FreeMarker模板(转)
在spring boot中使用FreeMarker模板非常简单方便,只需要简单几步就行: 1.引入依赖: <dependency> <groupId>org.springfra ...
- @RequestMapping value 能够反复吗 [
@RequestMapping value 能够反复吗 [问题点数:40分,结帖人wangqiao4j] 不显示删除回复显示全部回复 显示星级回复显示得分回复 仅仅显示楼主 u=http://bbs. ...
- jQuery笔记---选择器
查找API,jQuery选择器,定位标签 1.基本选择器 id定位标签 class属性定位标签 标签名定位标签 2.举例 <html> <head> <meta http ...
- Effective C++ 条款28
避免返回handles指向对象内部成分 本节作者讲述的知识核心是对于一个类来说,应该避免类返回自己内部的私有数据. 例如以下: class Point{ public: Point(int x, in ...
- 【33.10%】【codeforces 604C】Alternative Thinking
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Linux系统编程——线程私有数据
在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #inclu ...
- C# 使用 RabbitMQ
1. RabbitMQ MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接 ...
- chrome-vimium在markdown插件的页面失去效果
chrome-vimium在markdown插件的页面失去效果
- 【C++竞赛 H】The sum problem
Time Limit: 1s Memory Limit: 32MB 问题描述 Given a sequence 1,2,3,-,N, your job is to calculate the numb ...
- JavaScript实现form表单的多文件上传
form表单的多文件上传,具体内容如下 formData对象可以使用一系列的键值对来模拟一个完整的表单,然后使用Ajax来发送这个表单 使用<form>表单初始化FormData对象的方式 ...