背包问题(三种动态规划) 代码(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. 编程——C语言的问题,堆栈

    堆和栈的区别一.预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...

  2. python基础-合并列表

    1.append()  向列表尾部追加一个新元素,列表只占一个索引位,在原有列表上增加 2.extend() 向列表尾部追加一个列表,将列表中的每个元素都追加进来,在原有列表上增加 3.+  直接用+ ...

  3. 【Codeforces Round #437 (Div. 2) C】 Ordering Pizza

    [链接]h在这里写链接 [题意]     给你参赛者的数量以及一个整数S表示每块披萨的片数.     每个参数者有3个参数,si,ai,bi;     表示第i个参赛者它要吃的披萨的片数,以及吃一片第 ...

  4. Vertx简介

    今天看了一篇很不错的关于Vertx的简介,转载下. 原文链接:http://www.csdn.net/article/2015-12-21/2826533?utm_source=tuicool& ...

  5. xmppframework开发基础

    xmppframework是XMPP协议的一个objective-c实现. 要了解xmppframework, 从这里開始吧:https://github.com/robbiehanson/XMPPF ...

  6. android Fragment与Activity交互,互相发数据(附图具体解释)

    笔者最近看官方training.发现了非常多实用又好玩的知识. 当中.fragment与Activity通信就是一个. fragment与Activity通信主要是两点: 1.fragment传递信息 ...

  7. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  8. 【t063】最聪明的机器人

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] [背景] Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ [问题描述] ...

  9. leetcode笔记:Remove Duplicates from Sorted Array II

    一.题目描写叙述 二.解题技巧 这道题和Remove Duplicates from Sorted Array这道题是相似的.仅仅只是这里同意出现反复的数字而已,能够採用二分搜索的变种算法.仅仅只是增 ...

  10. ios开发网络学习四:NSURLConnection大文件断点下载

    #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...