动态规划5:01背包问题和完全背包问题不同空间复杂度的解法

本文详述了01背包问题和完全背包问题的动态规划解法,分别讨论了空间复杂度为O(V)和O(nV),时间复杂度为O(V)和O(nV)的方案,并通过测试结果对比分析了两种问题的不同之处,特别是状态转移方程在完全背包问题中的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01背包问题

1.空间复杂度O(V) 时间复杂度O(V)

/*
 * 01背包问题
 * 件数 5 最大重量 8
 * 3 5 1 2 2
 * 4 5 2 1 3
 * */
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "vector"

using namespace std;
const int maxn = 100;//物品最大件数
const int maxv = 1000;//容量上限
int w[maxn], c[maxn], dp[maxv];

/*
 * w[] 物品重量
 * c[] 物品价值
 * dp[v] 容量为v时物品最大价值

 * */

int main() {
   
    int n, V;//件数 总容量
    scanf("%d%d", &n, &V);
    for (int i = 1; i <= n; i++) {
   
        //物品容量
        scanf("%d", &w[i]);

    }
    for (int i = 1; i <= n; i++) {
   
        //物品价值
        scanf("%d", &c[i]);

    }
    //边界
    //使用滚动数组 倒序查找
    for (int v = 0; v <= V; v++)
        dp[v] = 0;
    //求解
    for (int i = 1; i <= n; i++) {
   
        printf("\n");
        for (int v = V; v >= w[i]; v--) {
   
            //状态转移方程
            //放入或不放入第i件物品的价值
            printf("剩余v: %d  ", v);
            printf("w[%d]: %d  ", i, w[i]);
            printf("dp[%d]: %d  dp[%d]+c[%d]: %d  ", v, dp[v], v - w[i], i, dp[v - w[i]] + c[i]);
            dp[v] = max(dp[v], dp[v - w[i]] + c[i]);
            printf("新dp[%d]: %d  \n", v, dp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有胡子的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值