21xrx.com
2024-11-10 00:18:10 Sunday
登录
文章检索 我的文章 写文章
01背包问题的C++代码
2023-07-04 21:42:46 深夜i     --     --
01背包 C++代码 动态规划

01背包问题是一种经典的动态规划问题,其基本思路是对于给定的一组物品,每个物品有自己的重量和价值,在限制的总重量范围内,选择其中若干个物品,使得这些物品的重量总和不超过限制,同时价值总和最大。下面是01背包问题的C++代码。


#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int knapsack(int W, vector<int> wt, vector<int> val, int n) {

  int dp[n+1][W+1];

  for (int i = 0; i <= n; i++) {

    for (int w = 0; w <= W; w++) {

      if (i == 0 || w == 0)

        dp[i][w] = 0;

      else if (wt[i-1] <= w)

        dp[i][w] = max(dp[i-1][w], dp[i-1][w-wt[i-1]] + val[i-1]);

      else

        dp[i][w] = dp[i-1][w];

    }

  }

  return dp[n][W];

}

int main() {

  int N, W;

  cin >> N >> W;

  vector<int> wt(N), val(N);

  for (int i = 0; i < N; i++) {

    cin >> wt[i] >> val[i];

  }

  cout << knapsack(W, wt, val, N) << endl;

  return 0;

}

上面的代码中,我们采用了动态规划的思想,使用二维数组来存储子问题的解,即dp[i][w]表示前i个物品中在重量不超过w的情况下的最大价值。其中,初始状态为dp[0][0]=0,表示没有物品,当i=0或者w=0时,dp[i][w]都为0。对于每个物品,我们可以选择装入或不装入背包,如果装入背包,那么最大价值为dp[i-1][w-wt[i-1]]+val[i-1],即不包括当前物品时的最大价值加上当前物品的价值,如果不装入背包,那么最大价值为dp[i-1][w]。最终,最大价值即为dp[N][W],其中N表示物品的个数,W表示背包的容量。

总之,01背包问题是一道经典的动态规划问题,对于初学者来说,可以通过理解和掌握上面的C++代码来深入学习和理解动态规划的基本思想和应用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复