acwing 2 普通背包 2维做法的坑

在这里插入图片描述
背包问题应该都挺熟了,但还是放一下题目

无论是一维还是二维的解法,思路都比较一致,就是用一个二维的 d p dp dp矩阵, d p [ i ] [ j ] dp[i][j] dp[i][j] 的定义为前 i i i 个元素的最优组合在容量为 j j j 的背包的最大价值。
这个定义非常的巧妙并且很难直接想到,因此,很多dp题目会以背包作为变种,因此,背包是dp中非常经典的例子。

首先看一维的做法,如下所示,比较简单,注意细节:在内层循环中,如果 j < w j < w j<w了,可以直接返回。

#include <bits/stdc++.h>
//#include<ext/pb_ds/assoc_container.hpp>
//#include<ext/pb_ds/trie_policy.hpp>
//using namespace __gnu_pbds;

typedef long long ll;
using namespace std;

typedef pair<int, int> P;
int INF = 1 << 30;
int main()
{
    int N, W;
    scanf("%d %d", &N, &W);
    int dp[W+1];
    memset(dp, 0, sizeof(dp));
    for(int i=0;i<N;i++)
    {
        int v, w;
        scanf("%d %d", &w, &v);
        for(int j=W;j>=w;j--)
        {
            dp[j] = max(dp[j], dp[j-w]+v);
        }
    }
    printf("%d\n", dp[W]);
}

接下来看二维的做法,首先讲一下,为什么需要二维的做法,因为一维无法满足部分题目的条件,比如说,如果需要我们找到放进背包具体是哪几个物品,一维的是无法保存历史信息的,在这个例子下我们就需要保存二维矩阵,再进行回溯。

接下来看二维的代码,注意到就算 j < w j < w j<w 了,我们也不能跳出循环(这个会多消耗一些时间,但影响不大)而是要把上面的结果复制下来,算是和一维最重要的区别了。

#include <bits/stdc++.h>
using namespace std;

//#include<ext/pb_ds/assoc_container.hpp>
//#include<ext/pb_ds/trie_policy.hpp>
//using namespace __gnu_pbds;

typedef long long ll;
typedef vector<int> V;
// int MOD = 1e9 + 7;

int main()
{
    int N, W;
    scanf("%d %d", &N, &W);

    vector<V> dp(N+1, V(W+1, 0));

    for(int i=1;i<=N;i++)
    {
        int v, w;
        scanf("%d %d", &w, &v);
        for(int j=W;j>=0;j--)
        {
            if(j-w < 0)dp[i][j] = dp[i-1][j];
            else dp[i][j] = max(dp[i-1][j], dp[i-1][j-w]+v);
        }
    }


    printf("%d\n", dp[N][W]);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2subset问题和背包问题是两个不同的问题。 首先,2subset问题是一个集合论问题。给定一个集合S,判断它是否可以被分为两个子集合,使得两个子集合的元素之和相等。这个问题可以通过使用递归和回溯的方法来解决。 而背包问题是一个优化问题。在背包问题中,给定一组物品,每个物品具有重量和价值。同时给定一个背包的容量,目标是选择物品放入背包中,使得背包中物品的总价值最大化,但总重量不得超过背包的容量。背包问题可以分为01背包问题、完全背包问题和多重背包问题等多种变体。 其次,2subset问题是一个判断性问题,只需要判断给定的集合是否可以被划分为两个和相等的子集合。而背包问题是一个优化问题,需要找到一个最优解,即在满足约束条件的情况下,使背包中物品的总价值达到最大。 此外,解决这两个问题的算法也有所不同。对于2subset问题,可以使用递归和回溯的方法进行求解,但是由于2subset问题是一个NP完全问题,没有多项式时间的解决算法。而背包问题可以使用动态规划、贪心算法或者回溯算法等多种方法进行求解,对于某些特定情况下的背包问题,存在解决这个问题的多项式时间的算法。 综上所述,2subset问题和背包问题在问题定义、性质、解决方法和算法复杂度上都存在差异,是两个不同的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值