动态规划-背包问题——[模版]完全背包问题

1.题目解析

题目来源

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 模版完全背包_牛客题霸_牛客 |

测试用例

2.算法原理

1.状态表示

与01背包相同,这里的完全背包也是需要一个二维dp表来表示最大价值,具体如下

求最大价值****dpij:在1,i区间选择物品,此时总体积不大于j时的最大价值

求装满时的价值****dpij:在1,i区间选择物品,此时总体积严格等于j时的价值

2.状态转移方程

3.初始化

4.填表顺序

从上至下,每一行从左到右

5.返回值

返回最后一个位置dp表的值

3.实战代码

cpp 复制代码
#include <iostream>
#include <string.h>
using namespace std;
const int N = 1010;
int dp[N][N];
int n,V;
int v[N];
int w[N];

int main()
{
    cin>>n>>V;
    for(int i = 1;i <= n;i++)
    {
        cin>>v[i]>>w[i];
    }
    for(int i = 1;i <= n;i++)
    {
        for(int j = 0;j <= V;j++)
        {
            dp[i][j] = dp[i-1][j];
            if(j >= v[i])
            {
                dp[i][j] = max(dp[i][j],dp[i][j-v[i]] + w[i]);
            }
        }
    }
    cout<<dp[n][V]<<endl;

    memset(dp,0,sizeof(dp));
    for(int j = 1;j <= V;j++)
    {
        dp[0][j] = -1;
    }
    for(int i = 1;i <= n;i++)
    {
        for(int j = 0;j <= V;j++)
        {
            dp[i][j] = dp[i-1][j];
            if(j >= v[i] && dp[i][j-v[i]] != -1)
            {
                dp[i][j] = max(dp[i][j],dp[i][j-v[i]] + w[i]);
            }
        }
    }
    cout<<(dp[n][V] == -1 ? 0 : dp[n][V])<<endl;

    return 0;
}

代码解析

4.代码优化

相关推荐
让学习成为一种生活方式5 分钟前
苄基异喹啉生物碱糖基转移酶UGT74AN1晶体--Journal of Agricultural and Food Chemistry
人工智能·算法
早睡早起身体好1236 分钟前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
菩提树下的打坐6 分钟前
测试左移的更深一层:用 DDD 战术设计反推测试边界
学习
alphaTao9 分钟前
LeetCode 每日一题 2026/7/27-2026/8/2
python·算法·leetcode
888CC++30 分钟前
C++ 快速学习指南:从入门到进阶的实战路线
开发语言·c++
2501_9269783340 分钟前
提示工程的实战报告(二):模型的失败模式与边界行为
人工智能·深度学习·算法
小小晓.42 分钟前
C++记:函数
开发语言·c++·算法
casual~1 小时前
模逆元计算方法详解:扩展欧几里得算法与费马小定理
学习·算法·逆元
@Mike@1 小时前
06-数据库学习笔记(存储模型与数据压缩)
数据库·笔记·学习
脚踏实地皮皮晨1 小时前
002002002_DepandencyObject类2
开发语言·windows·算法·c#·visual studio