背包问题: 01背包, (python, golang, c)

news2024/12/23 15:44:41

01背包

题目

2. 01背包问题 - AcWing题库

有N件物品和一个容量是V的背包。每件物品只能使用一次。

第i件物品的体积是vi,价值是wi。

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

思路

https://alchemist-al.com/algorithms/knapsack-problem

状态转移方程

f\left ( i,v \right ) = max\left \{ f\left ( i-1,v \right ), f\left ( i-1,v - c[i]\right ) + w(i))\right \}

f(i, v) 表示前 i 件物品恰放入一个容量为 v 的背包可以获得的最大价值。

python3解法

方法一:二维数组

N, V = map(int, input().split())

goods = []
for i in range (N):
    goods.append([int(i) for i in input().split()])
    
dp = [[0 for i in range (V+1) ] for j in range (N+1)]
for i in range (1, N+1):
    row = dp[i]
    [v, w] = goods[i - 1]
    for j in range (1, V+1):
        if j >= v:
            row[j] = max(dp[i-1][j], dp[i-1][j-v] + w)
        else:
            row[j] = dp[i-1][j]

print(dp[N][V])

方法二:一维数组

N, V = map(int, input().split())

goods = []
for i in range (N):
    goods.append([int(i) for i in input().split()])
    
dp = [0 for i in range (V+1) ]
for i in range (1, N+1):
    [v, w] = goods[i - 1]
    for j in range (V, 0, -1):
        if j >= v:
            dp[j] = max(dp[j], dp[j-v] + w)

print(dp[V])

golang解法

方法一:二维数组

package main

import (
    "fmt"    
    "math"
)

func main() {
    var N, V int
    fmt.Scanf("%d %d", &N, &V)
    
    v := make([]int, N)
    w := make([]int, N)
    for i:=0; i<N; i++ {
        fmt.Scanf("%d %d", &v[i], &w[i])
    }

    dp := make([][]int, N+1)
    for i:=0; i<=N; i++ {
        dp[i] = make([]int, V+1)
    }
    
    for i:=1; i<=N; i++ {
        vi := v[i-1]
        wi := w[i-1]
        for j:=1; j<=V; j++ {
            if j >= vi {
                dp[i][j] = int(math.Max(float64(dp[i-1][j]), float64(dp[i-1][j-vi] + wi)))   
            } else {
                dp[i][j] = dp[i-1][j]
            }
        }
    }
    
    fmt.Println(dp[N][V])
}

方法二:一维数组

package main

import (
    "fmt"    
    "math"
)

func main() {
    var N, V int
    fmt.Scanf("%d %d", &N, &V)
    
    v := make([]int, N)
    w := make([]int, N)
    for i:=0; i<N; i++ {
        fmt.Scanf("%d %d", &v[i], &w[i])
    }

    dp := make([]int, V+1)
    
    for i:=1; i<=N; i++ {
        vi := v[i-1]
        wi := w[i-1]
        for j:=V; j>=1; j-- {
            if j >= vi {
                dp[j] = int(math.Max(float64(dp[j]), float64(dp[j-vi] + wi)))   
            }
        }
    }
    
    fmt.Println(dp[V])
}

c语言解法

方法一:二维数组

#include <stdio.h>

#define LENGTH 1001

int main() {
    int N, V;
    scanf("%d %d", &N, &V);
 
    int v[LENGTH], w[LENGTH];
    for (int i=0; i<N; i++) {
        scanf("%d %d", &v[i], &w[i]);
    }
    
    int dp[LENGTH][LENGTH];
    for (int i=1; i<=N; i++) {
        int vi = v[i-1];
        int wi = w[i-1];
        for (int j=1; j<=V; j++) {
            if (j >= vi && dp[i-1][j] < dp[i-1][j-vi] + wi) {
                dp[i][j] = dp[i-1][j-vi] + wi;
            } else {
                dp[i][j] = dp[i-1][j];
            }
        }
    }
    
    printf("%d", dp[N][V]);
    return 0;
}

方法二:一维数组

#include <stdio.h>

#define LENGTH 1001

int main() {
    int N, V;
    scanf("%d %d", &N, &V);
 
    int v[LENGTH], w[LENGTH];
    for (int i=0; i<N; i++) {
        scanf("%d %d", &v[i], &w[i]);
    }
    
    int dp[LENGTH];
    for (int i=0; i<=V; i++) {
        dp[i] = 0;
    }
    
    for (int i=1; i<=N; i++) {
        int vi = v[i-1];
        int wi = w[i-1];
        for (int j=V; j>=1; j--) {
            if (j >= vi && dp[j] < dp[j-vi] + wi) {
                dp[j] = dp[j-vi] + wi;
            }
        }
    }
    
    printf("%d", dp[V]);
    return 0;
}

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

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

相关文章

反调试专题丨反调试之BeingDebugged

一、x86下IsDebuggerPresent反调试以及反反调试 1、反调试 进程结构体PEB偏移0x2处是一个标志位&#xff0c;当当前程序在调试状态下时&#xff0c;这个标志位就会被改变&#xff1a; nt!_PEB 0x000 InheritedAddressSpace : UChar 0x001 ReadImageFileExecOptions : …

1-vue3初探学习1

vue3插件&#xff1b; vscode插件&#xff1b; 1.volar 【在vscode上安装】 -vue3.x的插件 2.浏览器作为服务的测试版本 Live Server --作为简要服务使用 1-vue3初探学习&#xff1a; 网站&#xff1a; https://cn.vuejs.org/ 2.cdn文件 https://unpkg.com/vue3/dist…

高性能消息中间件 RocketMQ

一、MQ简介 1.1 什么是MQ 消息&#xff1a;是MQ中最小的概念&#xff0c;本质就是一段数据。 队列&#xff1a;在MQ中使用队列的数据结构来存储消息。 MQ是把消息和队列结合起来&#xff0c;称为消息队列&#xff08;Message Queue&#xff09;&#xff0c;是基础数据结构中…

敏捷需求、迭代、缺陷规划管理工具

敏捷使用产品Backlog来管理需求&#xff0c;产品Backlog是一个需求的清单&#xff0c;按照需求的商业价值排序&#xff0c; 高优先级的需求在Backlog的最上层。产品Backlog是一个渐进明细的清单&#xff0c;它有4个主要特点&#xff0c;称之为DEEP&#xff1a; Detailed 合适的…

Midjourney推出5.2版本,更新zoom out功能

Midjourney是一款专业的图像处理软件&#xff0c;它可以让用户轻松地创造出高质量的图像。它最近宣布推出了5.2版本&#xff0c;这是一个重大的更新&#xff0c;其中最亮眼的功能就是zoom out功能。 zoom out功能可以让用户无限地缩小原始图像&#xff0c;同时保持图像的清晰度…

【http服务】使用命令来查看和停止端口

需求: 在Windows 10上&#xff0c;使用命令来查看和停止端口8000上的进程。 方法&#xff1a; 要查看所有端口以及它们所属的进程&#xff0c;您可以使用以下命令&#xff1a; Get-NetTCPConnection | Select-Object LocalPort, OwningProcess这将显示所有TCP连接的本地端口…

【Spring Cloud Alibaba Seata 处理分布式事务】——每天一点小知识

&#x1f4a7; S p r i n g C l o u d A l i b a b a S e a t a 处理分布式事务 \color{#FF1493}{Spring Cloud Alibaba Seata 处理分布式事务} SpringCloudAlibabaSeata处理分布式事务&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f98…

CentOs8开启网卡配置

1.查看网卡文件 ls /etc/sysconfig/network-scripts/ 网卡文件名为 ifcfg-ens160 2.编辑网卡配置 vi /etc/sysconfig/network-scripts/ifcfn-ens160 按Esc结束编辑&#xff0c;然后冒号 : 输入 wq保存并退出 3.启用网卡 nmcli c up ens160 ##centos8网络管理命令 nmcl…

多元回归预测 | Matlab灰狼算法(GWO)优化极限学习机ELM回归预测,GWO-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab灰狼算法(GWO)优化极限学习机ELM回归预测,GWO-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环…

AI智慧安监EasyCVR平台长时间运行出现协程高的现象是什么原因?

EasyCVR视频融合平台基于云边端协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理&#xff0c;可支持多协议接入&#xff0c;包括市场主流标准协议与厂家私有协议及SDK&#xff0c;如&#xff1a;国标GB28181、RTMP、RTSP/Onvif、海…

idea2019.3启动不起来_卡在启动界面

.其实是因为Windows的语音设置导致的. 这里可以,找到控制面板,然后找到,右上角查看方式,选择,类别 2.然后找到时钟和区域 点击时钟和区域 然后 点击区域 然后在区域界面 点击区域选项卡,然后找到 管理,点击管理,然后点击更改系统区域设置 然后看下面的图,这里不要勾选Beta版…

工程安全监测无线振弦采集仪在建筑物的应用分析

工程安全监测无线振弦采集仪在建筑物的应用 工程安全监测无线振弦采集仪是一种在建筑物中应用的重要设备。它通过无线采集建筑物内部的振动信息&#xff0c;对建筑物的安全性进行监测和评估&#xff0c;为建筑物的施工和使用提供了可靠的技术支持。本文将详细介绍工程安全监测…

ModaHub魔搭社区:向量数据库Milvus部署运维问题教程(一)

目录 部署运维问题 如果在安装 Milvus 时&#xff0c;从 Docker Hub 拉取镜像总是失败怎么办&#xff1f; Milvus 只能使用 Docker 部署吗&#xff1f; 为什么 Milvus 返回 config check error 的错误&#xff1f; 为什么在导入数据时 Milvus 显示 no space left on devic…

【Spring Cloud Alibaba Sentinel 实现熔断与限流】 —— 每天一点小知识

&#x1f4a7; S p r i n g C l o u d A l i b a b a S e n t i n e l 实现熔断与限流 \color{#FF1493}{Spring Cloud Alibaba Sentinel 实现熔断与限流} SpringCloudAlibabaSentinel实现熔断与限流&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨…

黑马微信小程序-实现本地服务九宫格并展示商品列表

一、九宫格实现 1.获取数据 1.1准备接口 黑马接口&#xff1a;https://applet-base-api-t.itheima.net/categories 说明&#xff1a;这是获取九宫格的数据接口 1.2使用接口 说明&#xff1a;声明变量获取数据。 getGridList() {wx.request({url: https://applet-base-api-t.…

用雪花 id 和 uuid 还是自增id做 MySQL 主键

MySQL中设计表的时候&#xff0c;MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一)&#xff0c;而是推荐连续自增的主键id&#xff0c;官方的推荐是auto_increment&#xff0c;那么为什么不建议采用uuid&#xff0c;使用uuid究竟有什么坏处&#xff1f; MySQ…

如何应用Nginx Rewrit

目录 一、Nginx Rewrite 二、Rewrite功能 Rewrite跳转场景 Rewrite跳转实现 Nginx 跳转 pcre支持 重写模块 Rewrite实际场景 Rewrite命令/语法格式 flag标记说明 location分类 location优先级 rewrite和location相比 三、跳转案例 实现域名跳转 第一步 修改指…

Gof23设计模式之原型模式

1.概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2.结构 原型模式包含一下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现的clone()方法具体原型类&#xff1a;实现了抽象圆形类的clone()方法…

Opencv 源码编译以及调用相关

查看Ubuntu上面已经安装的opencv的版本 pkg-config --modversion opencv源码编译 源码下载, 注意其中的batch&#xff0c; 选择一致。 git clone https://github.com/opencv/opencv.git # 下面的仓库为第三方库&#xff0c;可以根据需要选择 git clone https://github.com/o…

npm install --save-dev electron报错

报错&#xff1a; 清除一下缓存&#xff0c;并删除掉node_module npm cache clean --force切换cnpm安装 npm install -g cnpm --registryhttps://registry.npm.taobao.org安装electron cnpm i electron --save-d安装成功&#xff01;