• 0-1背包

1、问题定义:

  给定n种物品和背包。物品i的重量是wi,价值是vi,每种物品只有一个,背包容量为C。问:应该如何选择装入背包的物品,使得装入背包中的物品总值最大。

2、算法思路:

  选择装入背包的物品时,对于物品i,只有两种选择,一种是装入,一种是不装入。定义m[i][j]表示背包容量为j,给定编号1-i号物品时,背包装入物品的最大价值。

初始化矩阵m:当只有物品1时,背包容量大于物品1的体积,放入。背包容量小于物品1的体积时,不放入。

同理,对于第i件物品,如果放入可以使得背包的价值增大且不超过背包容量,就放入,反之,不放入。

3、具体代码:

int N = ;
void knapsack(int *v, int *w, int c, int m[N+][]) {
int min = w[] > c ? c : w[];
for(int j = ; j < min; j++)
m[][j] =
for(int j = w[]; j <= c; j++)
m[][j] = v[]; for(int i = ; i <= N; i++){
min = w[i] > c ? c : w[i]
for(int j = ; j < min; j++)
m[i][j] = m[i-][j];
for(int j = w[i]; j < c; j++)
m[i][j] = m[i-][j-w[i]] + v[i] > m[i-][j] ? m[i-][j-w[i]] + v[i] : m[i-][j]
}
}
//x[N+1]存放取得最大价值的背包中放入的物品,x[i] = 1表示放入了物品i,x[i] = 0表示没有放入。
void traceback(int m[N+][], int *w, int c, int *x){
for(int i = n; i>; i++){
if(m[i][c] == m[i-][c])
x[i] == ;
else
{
x[i] = ;
c -= w[i];
}
}
x[] = m[][c] > ? :
}
  • 完全背包

问题定义:

  给定n种物品和背包。物品i的重量是wi,价值是vi,每种物品有无限个,背包容量为C。问:应该如何选择装入背包的物品,使得装入背包中的物品总值最大。

算法思路:

  对于0-1背包问题,是否放入第i件物品取决于选取1到i-1件物品中若干件放入背包后的状态,因为每种物品只有一件,放与不放都会影响后续物品是否能放入。对于完全背包问题,  每次加入一个新的物品类别i时,都要对背包的不同容量下的价值进行更新,因为在未加入新的物品类别i时,1-i号物品已经将背包装满了。因此m[i][j]的值与m[i-1]无关。

具体算法:

#include<iostream>
#include<string.h>
#include<limits>
using namespace std;
void C_backpack(int *v, int *w, int c, int n, int *m, int *ans){
for(int i = ; i <= c; i++){
m[i] = ;
ans[i] = ;
} for(int i = ; i <= n; i++){
for(int j = w[i]; j <= c; j++){
if(m[j-w[i]] + v[i] > m[j]){
m[j] = m[j-w[i]]+v[i];
ans[j] = i;
}
}
}
}
void traceback(int *ans, int *x, int c, int *w){
while(c > ){
int id = ans[c];
x[id] ++;
c -= w[id];
}
}
int main(){
int c = , n = ;
//ans[i]表示当背包容积为j时放入的最后一个物品的编号,用来回溯得到每个物品被放入背包的个数
int ans[c+], w[n+] = {INT_MAX, , , }, v[n+] = {, , , };
int m[c+], x[n+]; //记录每个物品被放入背包的个数
memset(x , , sizeof(x));
C_backpack(v, w, c, n, m, ans);
traceback(ans, x, c, w);
for(int i = ; i <= n; i++)
cout<<x[i]<<" ";
cout<<endl;
cout<<m[c];
}

运行结果:

dp背包问题的更多相关文章

  1. POJ 1417 True Liars(种类并查集+dp背包问题)

    题目大意: 一共有p1+p2个人,分成两组,一组p1,一组p2.给出N个条件,格式如下: x y yes表示x和y分到同一组,即同是好人或者同是坏人. x y no表示x和y分到不同组,一个为好人,一 ...

  2. HDU 1561 树形DP背包问题

    这是自己第一道背包上树形结构问题,不是很理解这个概念的可以先看看背包九讲 自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次AC了还是有点小激动的 题目大意是: 攻克m个城市,每 ...

  3. DP背包问题小总结

    DP的背包问题可谓是最基础的DP了,分为01背包,完全背包,多重背包 01背包 装与不装是一个问题 01背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每件物 ...

  4. DP背包问题学习笔记及系列练习题

    01 背包: 01背包:在M件物品中取出若干件物品放到背包中,每件物品对应的体积v1,v2,v3,....对应的价值为w1,w2,w3,,,,,每件物品最多拿一件. 和很多DP题一样,对于每一个物品, ...

  5. HDU 3127 WHUgirls dp背包问题

    WHUgirls Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  6. 记忆搜索与动态规划——DP背包问题

    题目描述 01背包问题 有n个重量和价值分别为\(w_i,v_i\)的物品.从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值中总和的最大值. 限制条件 1 <= n <= 10 ...

  7. [poj 1947]树dp+背包问题

    题目链接:http://poj.org/problem?id=1947 看了很多题解都是直接一遍dfs就搞定的方法,但是我实在是没看懂那个转移方程.最后在茫茫博客中终于发现了一个有逻辑的方法,但是复杂 ...

  8. URAL 1108 简单的树形dp背包问题

    题目大意: 一颗苹果树上,每条边都对应了一个权值,最后留下包括root : 1在的含有 m 条边的子树 , 希望留下的子树中权值之和最大 这里保留m条边,我们可以看作是保留了 m + 1 个点 令dp ...

  9. 动态规划(DP)基础

    DP基础 简单dp 背包问题 记忆化搜索 简单dp 数字三角形 给一个数字构成的三角形,求从顶端走到底部的一条路径,使得路径上的和最大(或者最小). 1 2 3 6 5 4 Example_1 7 3 ...

随机推荐

  1. Linq高级查询,分页查询及查询分页结合

    一.高级查询与分页查询 1.以...开头    StartsWith Repeater1.DataSource=con.Users.Where(r=>r.Nickname.StartsWith( ...

  2. 20175208《Java程序设计》第五周学习总结

    教材学习内容总结 1.接口:1)接口声明: interface //接口的名字 2)接口体2.实现接口:类实现接口:一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口.如果实 ...

  3. Redis的数据结构、通用操作及其特性

    Redis的数据结构 五种数据类型: 字符串(String).字符串列表(list).字符串集合(set).有序字符串集合(sorted set).哈希(hash) key定义的注意点: 不要过长,不 ...

  4. puppeteer实现线上服务器任意区域截图

    整个九月份由于业务繁重以及玩心颇重,一直没有机会来写一篇博文.而且笔者于十月一日将会举办人生大事--婚礼,现在家里筹办过程中只能抽出零碎的时间来写这篇文章. 关于服务端截图,这种使用场景非常少见,大多 ...

  5. Python-王者荣耀自动刷金币+爬取英雄信息+图片

    前提:本文主要功能是 1.用python代刷王者荣耀金币 2.爬取英雄信息 3.爬取王者荣耀图片之类的. (全部免费附加源代码) 思路:第一个功能是在基于去年自动刷跳一跳python代码上面弄的,思路 ...

  6. Matlab 将两个图像进行分离 已知其中一个图像

    5.下图(a)是一幅两个灰度图像合成的图像,已知其中一幅图像如图(b)所示,试把另一幅图像提取出来,并显示. 运用减法做 %加载入要处理的图片 A=imread('a.png'); %将I变为[0,1 ...

  7. 2019-4-23 plan

    需要制作springcloud es6的技术文档和demo

  8. oracle基本查询

  9. 2019 面试准备 - JS 防抖与节流 (超级 重要!!!!!)

    Hello 小伙伴们,如果觉得本文还不错,记得给个 star , 你们的 star 是我学习的动力!GitHub 地址 本文涉及知识点: 防抖与节流 重绘与回流 浏览器解析 URL DNS 域名解析 ...

  10. 小程序App.js 传递数据给实例(app异步数据问题)

    在最开始初始化的时候,都会触发app.js 这个里面的onload生命方法, 在这个方法里面我们可以获取之前的存储数据/异步请求等等操作, 但是这些操作一般都是需要稍许时间.也就是说在其他界面加载结束 ...