背包问题(三种动态规划) 代码(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)的更多相关文章

  1. MVC3中,在control里面三种Html代码输出形式

    MVC3中,在control里面三种Html代码输出形式:ViewData["msg"] = "<br /> Title <br />" ...

  2. K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

      一.概述 在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别. 首先需要明确 ...

  3. 详解Spring面向切面编程(AOP)三种实现

    一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善. ...

  4. MVC-AOP(面向切面编程)思想-Filter 三种注册方式

    在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter.IActionFilter.IResultFilter.IExceptionFil ...

  5. shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法

    shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...

  6. 编程算法 - 食物链 并查集 代码(C)

    食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种 ...

  7. 编程算法 - 篱笆修理(Fence Repair) 代码(C)

    篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 分割的开销是木板长度, ...

  8. 编程算法 - 不用加减乘除做加法 代码(C)

    不用加减乘除做加法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 写一个函数, 求两个整数之和, 要求在函数体内不得使用+, -, *, /四 ...

  9. 编程算法 - 推断二叉树是不是平衡树 代码(C)

    推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结 ...

随机推荐

  1. 关于Clipboard和GlobalAlloc函数的关系

    一句话:为了满足进程间通信,使用了clipboard的方法,clipboard是系统提供的一段任何进程都可以访问的公共内存块,malloc 和new分配的动态内存块是在进程的私有地址空间分配的,所以必 ...

  2. (转)Oracle命令

    转自:http://www.cnblogs.com/NaughtyBoy/p/3181052.html Oracle登录命令 1.运行SQLPLUS工具 C:\Users\wd-pc>sqlpl ...

  3. java调用C++的过程

    转自https://blog.csdn.net/yjhdxflqm/article/details/50503551 jni是java和C.C++通信的桥梁. java适合写上层的应用,C.C++适合 ...

  4. UIScrollView(滚动试图)

    UIScrollView(滚动试图) 1.简介 为什么有UISCrollView: 在iOS开发中,由于移动设备的屏幕大小有限,所以不能像PC一样显示很多内容,因此当手机屏幕需要展示的内容较多超出一个 ...

  5. POJ 1833 生成排列

    题目链接:POJ 1833 /************************************ * author : Grant Yuan * time : 2014/10/19 16:38 ...

  6. 11、DMA操作说明

    先理解cache的作用CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中(hit)”,此时CPU直接从Cache中调用该内容:否则,就 称为“ 不命中”,CPU只好去内 ...

  7. [Angular 2] Set Values on Generated Angular 2 Templates with Template Context

    Angular 2 templates have a special let syntax that allows you to define and pass a context when they ...

  8. 数学之路-python计算实战(5)-初识numpy以及pypy下执行numpy

    N .有用的线性代数.傅里叶变换和随机数生成函数.numpy和稀疏矩阵运算包scipy配合使用更加方便.NumPy(Numeric Python)提供了很多高级的数值编程工具,如:矩阵数据类型.矢量处 ...

  9. 解决java中ZipFile解压缩时候的中文路径和乱码问题

    JAVA中对jar文件或zip文件解压的时候,能够使用JDK内置的API:JarFile和ZipFile,在windows下解压这2种格式文件的时候,常常报下面错误: Exception in thr ...

  10. HTML标签的权重

    原文 简书原文:https://www.jianshu.com/p/c86d540aec40 大纲 1.HTML权重标签 2.常见的权重标签 3.常见的权重标签的使用 1.HTML权重标签 SEOer ...