递归法解决多重背包问题

news2024/12/25 14:02:01

多重背包问题同样是01背包问题的变种,同样可以通过修改01背包部分代码来求解。

方法一:修改递归函数,根据题目新的限制条件——使用次数扩充状态参数个数,将同一个物品选用的次数同样作为参数传递到栈空间中,同时也对原状态数组扩充一位,防止记忆化搜索时状态溢出。

扩充状态数组:state[volume][worth]\rightarrow state[volume][worth][times]

改变递归函数:

int dfs(int code, int times, int vol_l)
{
    int jump, stay = 0;
    if(state[code][times][vol_l] != -1)
        return state[code][times][vol_l];

    if(vol_l < 0 || code == N || times > lst[code].num)
        state[code][times][vol_l] = 0;
    else
    {
        jump = dfs(code+1, 0, vol_l);
        if(vol_l >= lst[code].volume && lst[code].num > times)
            stay = dfs(code, times+1, vol_l-lst[code].volume)+lst[code].worth;
        
        state[code][times][vol_l] = max(jump_c, stay);
    }    
    return state[code][times][vol_l];    
}
#include <algorithm>

using namespace std;

struct goods
{
    int volume;
    int worth;
    int num;
};

int N, V;
int state[101][101][101];
goods lst[101];

int dfs(int code, int times, int vol_l)
{
    int jump, stay = 0;
    if(state[code][times][vol_l] != -1)
        return state[code][times][vol_l];

    if(vol_l < 0 || code == N || times > lst[code].num)
        state[code][times][vol_l] = 0;
    else
    {
        jump = dfs(code+1, 0, vol_l);
        if(vol_l >= lst[code].volume && lst[code].num > times)
            stay = dfs(code, times+1, vol_l-lst[code].volume)+lst[code].worth;
        
        state[code][times][vol_l] = max(jump_c, stay);
    }    
    return state[code][times][vol_l];    
}

int main()
{
    for(int i = 0; i < 101; i++)
        for(int j = 0; j < 101; j++)
            for(int t = 0; t < 101; t++)
                state[i][j][t] = -1;

    scanf("%d %d", &N, &V);

    for(int i = 0; i < N; i++)
        scanf("%d %d %d", &lst[i].volume, &lst[i].worth, &lst[i].num);  
    
    printf("%d", dfs(0, 0, V));
    return 0;
}

方法二:修改物品列表,仿照完全背包问题方法二对物品列表进行二次幂插入,且最大插入次数严格小于等于规定次数。

定义二次幂插入函数:

int binary_group[10] = {1,2,4,8,16,32,64,128,256,512};

void bi_divide(int input, int* out)
{
    int i = 0;
    for(; input-binary_group[i] >= 0; i++)
    {
        input -= binary_group[i];
        out[i] = binary_group[i];
    }
    out[i] = input;
    out[++i] = 0;
}

在main函数中调用物品插入函数:

int main()
{
    for(int i = 0; i < 10001; i++)
        for(int j = 0; j < 1010; j++)
            state[i][j] = -1;

    scanf("%d %d", &N, &V);

    for(int i = 0; i < N; i++)
    {
        scanf("%d %d %d", &lst[i].volume, &lst[i].worth, &lst[i].num);
        lst[i].num = min(lst[i].num, V/lst[i].volume);
        int add_i = 0;
        int ans[10];
        bi_divide(lst[i].num, ans);
        for(int j = 1; ans[j] != 0; j++)
        {
            lst[i+j].volume = ans[j]*lst[i].volume;
            lst[i+j].worth = ans[j]*lst[i].worth;
            add_i++;
        }
 
        i += add_i;
        N += add_i;
    }    
    
    printf("%d", dfs(0, V));
    return 0;
}
#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

struct goods
{
    int volume;
    int worth;
    int num;
};

int binary_group[10] = {1,2,4,8,16,32,64,128,256,512};

void bi_divide(int input, int* out)
{
    int i = 0;
    for(; input-binary_group[i] >= 0; i++)
    {
        input -= binary_group[i];
        out[i] = binary_group[i];
    }
    out[i] = input;
    out[++i] = 0;
}

int N, V;
int state[10001][1010];
goods lst[10001];

int dfs(int code, int vol_l)
{
    int refuse, choose;
    if(state[code][vol_l] != -1)
    {
        //cout << "[" << code << "," << vol_l << "]: " << state[code][vol_l] << endl;
        return state[code][vol_l];
    }


    if(vol_l <= 0 || code == N)
    {
        state[code][vol_l] = 0;
    }
    else
    {
        refuse = dfs(code+1, vol_l);
        if(vol_l >= lst[code].volume)
        {
            choose = dfs(code+1, vol_l-lst[code].volume)+lst[code].worth;
            //jump_r = dfs(code+1, vol_l-lst[code].volume)+lst[code].worth;
        }
        else
        {
            choose = 0;
            //jump_r = 0;
        }
        
        state[code][vol_l] = max(choose, refuse);
    }
    //cout << "[" << code << "," << vol_l << "]: " << state[code][vol_l] << endl;    
    return state[code][vol_l];    
}


int main()
{
    for(int i = 0; i < 10001; i++)
        for(int j = 0; j < 1010; j++)
            state[i][j] = -1;

    scanf("%d %d", &N, &V);

    //int add_t = 0;
    
    for(int i = 0; i < N; i++)
    {
        scanf("%d %d %d", &lst[i].volume, &lst[i].worth, &lst[i].num);
        lst[i].num = min(lst[i].num, V/lst[i].volume);
        int add_i = 0;
        int ans[10];
        bi_divide(lst[i].num, ans);
        for(int j = 1; ans[j] != 0; j++)
        {
            lst[i+j].volume = ans[j]*lst[i].volume;
            lst[i+j].worth = ans[j]*lst[i].worth;
            add_i++;
        }
        /*
        for(int j = 1; pow(2, j+1)-1 < lst[i].num; j++)
        {
            lst[i+j].volume = lst[i+j-1].volume*2;
            lst[i+j].worth = lst[i+j-1].worth*2;
            //add_t++;
            add_i++;
        }
        */
        i += add_i;
        N += add_i;
    }    
    //N += add_t;
    
    printf("%d", dfs(0, V));
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赖迪思软件 lattice Diamond

问题1&#xff1a;工程编译好后&#xff0c;git上传&#xff0c;变更分支又切换回来&#xff0c;再次编译有时候失败&#xff0c;所以配置好的管脚变成默认的&#xff0c;生成的IP核变成名变粗&#xff08;顶部文件&#xff0c;管脚配置显示IP核输入输出信号配置&#xff09;。…

PHP设计模式初探 以前写的完整PPT!!!!!

幻灯片 1: 初探PHP设计模式 copyright CSDN 白毛大侠 幻灯片 2: 我们说别人代码写的烂&#xff0c;烂在哪&#xff1f; 反思我们平时是怎么写代码的&#xff1f; 非开发者如何转开发&#xff08;业务&#xff09; &#xff1f; 一.过程与对象 幻灯片 3: <?…

17.来自Sora的夺舍妄想——享元模式详解

OpenAI 的 Sora 模型面世之后&#xff0c;可以说人类抵御AI的最后阵地也沦陷了。 在此之前&#xff0c;人们面对AI交互式对话&#xff0c;AI制图&#xff0c;AI建模之类的奇迹时&#xff0c;还可以略微放肆的说&#xff1a;“的确很神奇&#xff0c;这毕竟还是比人类世界低了一…

抖音视频评论数据挖掘软件|视频批量下载工具

这款基于C#开发的抖音视频评论数据挖掘软件是一款功能强大、易于使用的工具。它不仅支持通过关键词进行搜索抓取&#xff0c;还能够通过分享链接进行单个视频的抓取和下载。主要功能模块如下&#xff1a; 批量视频提取 操作模块&#xff1a;用户可以输入要搜索的关键词&#…

python:pyecharts 画基金净值 月K线图

pip install pyecharts1.9.1 pyecharts-1.9.1-py3-none-any.whl 我想在本地&#xff08;PC) 画出 基金净值 月K线图&#xff0c;不想每次看图都需联网。 cd my_dir mkdir echarts cd echarts curl -O https://assets.pyecharts.org/assets/echarts.min.js 修改一下开源代码 …

【飞桨EasyDL】飞桨EasyDL发布的模型转换onnx(附工程代码)

一个愿意伫立在巨人肩膀上的农民...... 一、paddle转onnx转rknn环境搭建 paddle转onnx和onnx转rknn两个环境可以分开搭建&#xff0c;也可以搭建在一起。这里选择分开搭建&#xff0c;先搭建paddle转onnx。 1.1、创建环境 选择python3.8.13包进行创建环境 conda create --nam…

Ubuntu22.04下在Spark2.4.0中采用Local模式配置并启动pyspark

目录 一、前言 二、版本信息 三、配置相关文件 1.修改spark-env.sh文件 2.修改.bashrc文件 四、安装Python3.5.2并更改默认Python版本 1.查看当前默认Python版本 2.安装Python3.5.2 2.1 下载Python源码 2.2 解压源码 2.3 配置安装路径 2.4 编译和安装 2.5 验证安装…

走进SQL审计视图——《OceanBase诊断系列》之二

1. 前言 在SQL性能诊断上&#xff0c;OceanBase有一个非常实用的功能 —— SQL审计视图(gv$sql_audit)。在OceanBase 4.0.0及更高版本中&#xff0c;该功能是 gv$ob_sql_audit。它可以使开发和运维人员更方便地排查在OceanBase上运行过的任意一条SQL&#xff0c;无论这些SQL是成…

最近半年博客产出的反思

最近完善boss资料的时候&#xff0c;我认为自己在大学期间学习过程中经常用博客记录学习内容以及在学习过程中写博客笔记是个不错的好习惯&#xff0c;在询问了师傅的意见之后决定把CSDN的主页也挂上去。 非常荣幸平台上今天有一位老师看见我的简历之后主动和我交流。对我的博客…

Sora来袭!机器人+Sora落地性如何?

2022年底&#xff0c;OpenAI正式推出ChatGPT&#xff0c;这款由人工智能技术驱动的自然语言处理工具能够通过学习和理解人类的语言来进行对话 。ChatGPT是OpenAI迈出的第一步&#xff0c;这款让所有人都能体会到人工智能潜力的现象级产品&#xff0c;展现出了文字对于过去人工智…

Xcode15与苹果ios17适配以及遇到的问题

大家好&#xff0c;我是你们的好朋友咕噜铁蛋&#xff01;最近&#xff0c;苹果发布了全新的iOS17系统&#xff0c;而作为开发者&#xff0c;我们需要确保我们的应用程序能够与这个新系统完美适配。因此&#xff0c;今天我将和大家分享一些关于Xcode15与苹果17系统适配的经验&a…

手写 Attention 迷你LLaMa2——LLM实战

https://github.com/Yuezhengrong/Implement-Attention-TinyLLaMa-from-scratch 1. Attention 1.1 Attention 灵魂10问 你怎么理解Attention&#xff1f; Scaled Dot-Product Attention中的Scaled&#xff1a; 1 d k \frac{1}{\sqrt{d_k}} dk​ ​1​ 的目的是调节内积&…

Parallel Computing - 一文讲懂并行计算

目录 Throughput/LatencySerial ComputingParallel ComputingTypes of parallel computersSimple 4-width SIMDAmdahls lawTypes of parallelism**Data Parallel Model**Task parallel PartitioningDomain DecompositionFunctional Decomposition CommunicationsExample that d…

Android 基础入门 基础简介

1. 观察App运行日志 2.Android 开发设计的编程语言 koltin Java c c 3.工程目录结构 4.Gradle 5.build.gradle 文件解析 plugins {id("com.android.application")//用了哪些插件 主配置文件版本控制 所以这里不用写版本 }android {namespace "com.tiger.myap…

unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自&#xff0c;内容并不相同&#xff1a;13ARPG网络游戏编程实践&#xff08;十三&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;四&#xff09;_哔哩哔哩_bilibili 现在的代码写在MessageManager.cs中&#xff0c;函数名UserHandler(是从OnMess…

mongodb 图形界面工具 -- Studio 3T(下载、安装、连接mongodb数据库)

目录 mongodb 图形界面工具 -- Studio 3T下载安装第一次使用&#xff1a;注册添加一个连接&#xff08;连接 mongodb 数据库&#xff09;1、点击【添加新连接】&#xff0c;选择【手动配置我的连接设置】2、对 Server 设置连接数据3、连接的用户认证设置&#xff08;创建数据库…

【系统分析师】-需求工程

一、需求工程 需求工程分为需求开发和需求管理。 需求开发&#xff1a;需求获取&#xff0c;需求分析&#xff0c;需求定义、需求验证。 需求管理&#xff1a;变更控制、版本控制、需求跟踪&#xff0c;需求状态跟踪。&#xff08;对需求基线的管理&#xff09; 1.1需求获取…

BUGKU 网站被黑

打开环境&#xff0c;什么都没发现&#xff0c;使用蚁剑扫描一下&#xff0c;发现shell.php&#xff0c;打开 使用BP抓包&#xff0c;进行爆破 得到密码&#xff1a;hack 进去得到flag

【python】1.python3.12.2和pycharm社区版的安装指南

欢迎来CILMY23的博客喔&#xff0c;本篇为【python】1.python3.12.2和pycharm社区版的安装指南&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 目录 一、python3.12.2的下载与安装 1.1下载 1.2安装 二、pycharm的安装 2.1下载安装 2…

Home-credit海外贷款信贷产品源码/线上贷款产品大全/贷款平台软件源码/海外借贷平台

测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.3、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态laravel5&#xff0c;开启ssl证书 语言&#xff1a;中文简体、英文 laravel框架的程序有点多&#xff0c;这个团队估计主要就是搞laravel开发的&#xff0c;基本上…