代码编织梦想

01背包:选一次,即 用一维优化时,需要倒序,因为选取的是上一行的更新,如果正序操作会覆盖掉最小的体积

完全背包:一个物品可以选多次,即 一维用优化时,正序即可,因为我们物品可以选多次,上一个转移方程可以来自同一行的前面几个值

若用二维,01背包是上一个背包转移过来的所以 i  - 1

完全背包二维的话就是直接 i 

//完全背包(与01背包不同,物品可以放多次)
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int f[N][N];
int v[N],w[N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i = 1;i <= n;i++)
    {
        cin>>v[i]>>w[i];
    }


    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            if(j < v[i])f[i][j] = f[i-1][j];
            else f[i][j] = max(f[i-1][j],f[i][j-v[i]] + w[i]);
        }
    }

    cout<<f[n][m]<<endl;
    return 0;
}
//一维优化
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int f[N];
int v[N],w[N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i = 1;i <= n;i++)
    {
        cin>>v[i]>>w[i];
    }
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            if(j < v[i]) f[j] = f[j];
            else f[j] = max(f[j],f[j-v[i]] + w[i]);
        }
    }

    cout<<f[m]<<endl;
    return 0;
}

//继续优化
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int f[N];
int v[N],w[N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i = 1;i <= n;i++)
    {
        cin>>v[i]>>w[i];
    }
    for(int i = 1;i <= n;i++)
    {
        for(int j = v[i];j <= m;j++)
        {
             f[j] = max(f[j],f[j-v[i]] + w[i]);
        }
    }

    cout<<f[m]<<endl;
    return 0;
}

多重背包一

其实就是01背包的变种,不过我们需要用二进制优化

//多重背包(有范围限定)
//可以转化成01背包完成
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int n,m;
int f[N][N],v[N],w[N],ans;
int s[N];

int main()
{
    cin>>n>>m;
    for(int i = 1;i <= n;i++)
    {
        cin>>v[i]>>w[i];
    }

    for(int i = 1;i <= n;i++)
    {
        for(int j = m;j >= v[i];j--)
        {
            for(int k = 0;k <= s[i] && k * v[i] <= j;k++)
            f[j] = max(f[j],f[j - k * v[i]] + k * w[i]);
        }
    }
    
//复杂度太高,不适合写

    return 0;
}

//二进制优化
//(优化为01背包问题)
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int n,m,v,w,s;
int vv[N],ww[N];
int f[N];
int main()
{
    cin>>n>>m;
    int num = 1;
    for(int i = 1;i <= n;i++)
    {
    cin>>v>>w>>s;
    for(int j = 1;j <= s;j<<=1)
    {
        vv[num] = j * v;//存体积
        ww[num++] = j * w;//存价值
        s -= j;//减去拆分系数
    }
    if(s)//剩余
    {
        vv[num] = s * v;
        ww[num++] = s * w;
    }
    
    }
    for(int i = 1;i < num;i++)//小于num是因为退出num拆分循环的时候,num++
    {
        for(int j = m;j >= vv[i];j--)
        {
            f[j] = max(f[j],f[j - vv[i]] + ww[i]);
        }
    }
    cout<<f[m]<<endl;




    return 0;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Demilly123/article/details/127941312

背包问题--贪心算法c#demo解析_viola_tt的博客-爱代码爱编程

概述 性质解题步骤 贪心VS动态规划C Demo感受 概述       贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,

背包问题常见题型_zz_outlier的博客-爱代码爱编程

背包问题oj汇总 前段时间试了一个几个互联网公司的笔试题,发现几个问题用的递归都没有能够达到 100% 的AC,于是准备重新温习一下递归和动态规划方面的内容。 而背包问题无疑是一个很好的补充:这里会陆续加入在oj中我

背包问题_冶无晴的博客-爱代码爱编程

这个问题总是看了忘,忘了看,昨天笔试碰到又不会做了。今天把它写在博客里,时时温习。 1. 01背包 01背包问题描述:有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,每件物品数量只有一个,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?  012345678910

01背包_rookie_2020的博客-爱代码爱编程

  前天在线面试的时候,面试官让我描述我学过的一些算法是怎么运算的,如最长公共子串,我知道其计算过程以及写法,但是突然让我口述过程,描述的时候越来越乱,面试结束后好好的整理了思绪,才觉得应该怎样怎样叙述过程才好,今天闲着也是

温习algs4 (一):背包, 栈, 队列和线性表_teeeye的博客-爱代码爱编程

背包, 栈, 队列和线性表 背包Bag.java复杂度分析 栈Stack.java复杂度分析 队列Queue.java复杂度分析 线性表Vector.java复杂度分析 总结 背包 背包是最简

【算法设计与分析】动态规划 - 背包问题详解(基础背包)-爱代码爱编程

文章目录 前言0-1背包问题描述问题解析性能优化:状态压缩完全背包基本思路细节上的优化多重背包基本思路效率优化总结参考资料 前言 最近又把背包系列问题温习了一遍,打算写篇文章将常见的几类背包问题进行总结,提取背包问题核心套路,在自己理解的同时,用通俗的语言解释,让看完本文的人能够快速上手解决一系列的背包问题。 内容包含如下: 从基础开始:

01背包问题(状态转移方程讲解)-爱代码爱编程

01背包问题(状态转移方程讲解) 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。 接下来有 N 行,每行两个整数 vi

01背包问题递归c语言程序,P1005 (C++代码)简单的01背包问题(递归 + 记忆化搜索)...-爱代码爱编程

解题思路:简单的01背包问题 注意事项:借此题重新温习了一下01背包问题,用到记忆化搜索 递归版便于理解,理解之后想要更加精简的写法可以看看我的循环版 参考代码: #include #include using namespace std; int t, m; int arr[101], v[101]; int dp[101][1

2022年小游戏----游戏背包系统(三)-爱代码爱编程

文章目录 蓝图展示UI_Main_Bag蓝图UI_Main_Bag_Item蓝图创建数据结构和数据表创建数据结构引用结构创建数据表编辑UI_Main_Bag_Item图表使用标签获取数据表数据将提取得到数据进行结构分解将结构体中的贴图刷到图片上图表总览编辑UI_Main_Bag图表创建背包页面加载函数设置背包页面数据设置点击按钮如何切换页面将上述功

蓝桥杯十大常见天阶功法——炎之呼吸.叁之型.动态规划--(上篇)-爱代码爱编程

🔔燃烧炽热心灵的炎,照亮动态规划的光 💓叁之型上篇总览💓动态规划简述💓壹 - 试题 算法提高 夺宝奇兵🌱题目描述🌴解题报告🌵参考代码(C++版本)💓贰 - 历届试题 数字三角形【第十一届】【省赛】【C组】🌱题目描述🌴解题报告🌵参考代码(C++版本)💓叁 - 历届真题 蓝肽子序列【第十一届】【决赛】【研究生组】🌱题目描述🌴解题报告🌵参考代码(C++版