01背包问题模板代码

01背包问题

Pleiades_Antares

打个模板,基本上01背包都这个样子了~

从百度上摘来两张图,简单可以说明01背包了应该

这是我找的第一张

这是我找的第二张

01背包是DP的内容,DP刚开始学一般都是记忆化搜索嘛,那就是优化过的搜索问题

不知道这么说各位能不能理解“记忆化搜索”这个名字qwq

如果需要的更详细的解释的话麻烦评论下/站内信,我把具体的内容再发出来

(quq我都有课件阔是我懒得再搬运PPT了qwq需要的话再发出来咯)

代码放出来:

//01背包
#include<iostream>
using namespace std;
//stellar myself!
const int maxn=1000;
int m[maxn][maxn];
int w[maxn],v[maxn];
int C,N;
void add(int i,int j){
    if (j<w[i])
        m[i][j]=m[i-1][j];
    else
        m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
}
int main(){
    cin>>N>>C;
    for(int i=1;i<=N;i++){
        cin>>w[i]>>v[i];
    }
    for(int i=1;i<=N;i++){
        for(int j=1;j<=C;j++){
            add(i,j);
        }
    }
    int big=m[1][1];
    for(int i=1;i<=N;i++){
        for(int j=1;j<=C;j++){
            if (m[i][j]>big) big=m[i][j];
        }
    }
    cout<<big<<endl;
    return 0;
} 

如有疏漏还请指出

原文地址:https://www.cnblogs.com/irischen/p/01-backpack.html

时间: 2024-10-06 16:57:20

01背包问题模板代码的相关文章

动态规划之01背包问题(含代码C)

1.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间.我们可以用一个表来记录所有已解的子问题的答案.不管该子问题以

动态规划 -- 01背包问题和完全背包问题

动态规划的01背包问题和完全背包问题模板 01背包问题模板: // 01背包问题 #include <stdio.h> #include <algorithm> using namespace std; const int maxn = 100; // 物品的最大件数 const int maxv = 1000; // V的上限 int w[maxn], c[maxn], dp[maxv]; int main() { // 边界 for (int v = 0; v <= V;

POJ 3624 Charm Bracelet(01背包模板)

Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45191   Accepted: 19318 Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible fro

1085 背包问题(0-1背包模板题)

1085 背包问题(0-1背包模板题)(51NOD基础题) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数,N和W中间用空格隔开.N为物品的数量,W为背包的容量.(1 <= N <= 100,1 <= W <= 10000) 第2 - N + 1行,每行

01背包问题(空间优化)经典代码

题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必要将它详细解释一下

回溯法-01背包问题之一:递归模式

一.回溯法 回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中按照深度优先的策略,从根节点出发搜索解空间树.算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解.如果肯定不包含,则跳过对以该节点为根的子树的系统搜索,逐层向其原先节点回溯.否则,进入该子树,继续按深度优先的策略进行搜索. 运用回溯法解题通常包含以下三个步骤: · 针对所给问题,定义问题的解空间: · 确定易于搜索的解空间结构: · 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函

回溯法-01背包问题之二:顺序执行模式

上文已讲述了回溯法以及01背包问题的原理,本文讲述如何顺序执行解决01背包问题以及通过模板模式重构软件. 一.顺序执行流程图 图1无剪枝函数的01背包问题顺序执行算法流程图 图2 有剪枝函数的01背包问题顺序执行算法流程图 无剪枝函数是通用的深度遍历算法,为了减少搜索深度可通过剪枝函数处理完全不可能的分枝.与递归方案的区别主要表现在i>=n后需要"回溯",即用后进先出的方式将物品逐个拿出. 二.执行代码 递归与顺序执行方法仅仅是实现方法Backtracking(int i)不同,

01背包模板、全然背包 and 多重背包(模板)

转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 模版就直接贴代码: 01背包模板: /* 01背包问题 01背包问题的特点是,">每种物品仅有一件.能够选择放或不放. 01背包问题描写叙述: 有N件物品和一个容量为V的背包. 第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品

01背包模板

转载请注明出处:http://blog.csdn.net/u012860063 模版就直接贴代码: 01背包问题 01背包问题的特点是,每种物品仅有一件,可以选择放或不放. 01背包问题描述: 有N件物品和一个容量为V的背包.第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大. #include <stdio.h> int max(int x,int y) { int M; M=x>y ? x : y; return