01背包问题
Posted Anthony_azy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01背包问题相关的知识,希望对你有一定的参考价值。
有n个重量和价值分别为wi,vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n, W; int dp[1000][1000]; //记忆化数组 int w[1000], v[1000]; int rec(int i, int j) { if (dp[i][j] >= 0) //已经计算过的话直接使用之前的结果 return dp[i][j]; int res; if (i == n) res = 0; else if (j < w[i]) res = rec(i + 1, j); else res = max(rec(i + 1, j), rec(i + 1, j - w[i]) + v[i]); return dp[i][j] = res; //将结果记录在数组中 } int main() { scanf("%d%d", &n, &W); for (int i = 0; i < n; i++){ scanf("%d%d", &w[i], &v[i]); } memset (dp, -1, sizeof(dp)); //用-1表示尚未计算过,初始化整个数组 printf("%d\n", rec(0, W)); return 0; }
以上是关于01背包问题的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第四十二天 | 01背包问题,你该了解这些01背包问题,你该了解这些 滚动数组 416. 分割等和子集