不止一个背包的背包问题_分组背包问题

不止一个背包的背包问题_分组背包问题有 N 种物品和一个容量是 V 的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用 si 次(多重背包);每种体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。si=−1 表示第 i 种

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

有 N 种物品和一个容量是 V 的背包。

物品一共有三类:

第一类物品只能用1次(01背包);
第二类物品可以用无限次(完全背包);
第三类物品最多只能用 si 次(多重背包);
每种体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

si=−1 表示第 i 种物品只能用1次;
si=0 表示第 i 种物品可以用无限次;
si>0 表示第 i 种物品可以使用 si 次;
输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000
0<vi,wi≤1000
−1≤si≤1000

输入样例
4 5
1 2 -1
2 4 1
3 4 0
4 5 2
输出样例:
8
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int f[N],g[N];
int q[N];
int main(){ 
   
    int n,m;
    cin>>n>>m;
    int v,w,s;
    memset(f,0,sizeof f);
    for(int i = 0;i < n;i ++){ 
   
        cin>>v>>w>>s;
        if(s == -1){ 
   
            for(int j = m;j >= v;j --){ 
   
                f[j] = max(f[j],f[j - v] + w);
            }
        }
        else if(s == 0){ 
   
            for(int j = v;j <= m;j ++){ 
   
                f[j] = max(f[j],f[j - v] + w);
            }
        }else{ 
   
            memcpy(g,f,sizeof f);
            for(int j = 0;j < v;j ++){ 
   
                int hh = 0,tt = 0;
                for(int k = j;k <= m;k += v){ 
   
                    if(hh < tt && q[hh] < k - s * v)hh ++;
                    while(hh < tt && g[q[tt - 1]] - (q[tt - 1] - j) / v * w <= g[k] - (k - j) / v * w)tt --;
                    q[tt ++] = k;
                    f[k] = g[q[hh]] + (k - q[hh]) / v * w;
                }
            }
        }
    }
    cout<<f[m];
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169153.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dubbo框架RPC过程详解「建议收藏」

    转载地址:http://www.cnblogs.com/LBSer/p/4853234.html你应该知道的RPC原理  在学校期间大家都写过不少程序,比如写个helloworld服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。  而一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的

    2022年4月11日
    54
  • Linux curl 命令模拟 POST/GET 请求「建议收藏」

    Linux curl 命令模拟 POST/GET 请求「建议收藏」curl命令,是一个利用URL规则在命令行下工作的文件传输工具。curl支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、FTP等众多协议,还支持GET、POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征,还可以做网页处理流程和数据检索自动化。 …

    2022年7月27日
    18
  • postman使用教程1

    postman使用教程1  在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下,这样的话就非常需要有一个比较给力的Http请求模拟工具,现在流行的这种工具也挺多的,像火狐浏览器插件-RESTClient,Chrome浏览器插件-Postman等等。这里主要介绍一下Postman。 一、Postman说明  Postman是一种网页调试与发送网页http请求的chrome插件…

    2022年5月6日
    53
  • 范数对于数学的意义?1范数、2范数、无穷范数

    作者:JIWeiwei链接:https://www.zhihu.com/question/21868680/answer/25599956来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:Faaany链接:https://www.zhihu.com/question/21868680/answer/136376374来源:知乎著作权归作者所有。商业转载请联系作者…

    2022年4月6日
    74
  • 散列_双重散列

    散列_双重散列散列

    2022年4月21日
    55
  • python中如何打开csv文件_python如何读取csv文件

    python中如何打开csv文件_python如何读取csv文件python如何读取csv文件,我们这里需要用到python自带的csv模块,有了这个模块读取数据就变得非常容易了。工具/原料python3方法/步骤1这里以sublimetext3编辑器作为示范,新建一个文档。2我们可以先确认CSV文档是否可以正确打开。并且放在同一个文件夹里面。3importcsv这是第一步要做的,就是调用csv模块。4importcsvfile=open(‘data…

    2022年7月21日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号