有N件物品和一个容量是 V 的背包,每个物品有各自的体积和价值,且每个物品可以放多次,如何让背包里装入的物品具有最大的价值总和?
本篇将给出代码,具体讲解请移步以下博客:动态规划入门:从暴力dfs到dp-CSDN博客
从01背包开始动态规划:暴力解法 + dp + 滚动数组 + dp优化-CSDN博客
方法1:暴力dfs
#include<iostream>
#include<cmath>
using namespace std;int n,V;
const int N = 1010;
int v[N];
int w[N];int dfs(int index,int spV){if(index > n) return 0;//可以在选第index个物品if(spV >= v[index])return max(dfs(index + 1,spV),dfs(index,spV - v[index]) + w[index]);else return dfs(index + 1,spV);
}int main(){cin >> n >> V;for(int i = 1;i <= n;i++){cin >> v[i] >> w[i];}cout << dfs(1,V);return 0;
}
方法二:dp,二维数组
- 递推公式 = dfs向下递归公式
- 递推数组初始值 = dfs递归边界
#include<iostream>
using namespace std;int n,V;
const int N = 1010;
int v[N];
int w[N];
int f[N][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++){f[i][j] = f[i - 1][j];if(j >= v[i])f[i][j] = max(f[i - 1][j],f[i][j - v[i]] + w[i]);}}int res = 0;for(int i = 0;i <= V;i++){if(res < f[n][i])res = f[n][i];}cout << res;return 0;
}
方法三:dp优化,一维数组
#include<iostream>
using namespace std;int n,V;
const int N = 1010;
int v[N];
int w[N];
int f[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++){if(j >= v[i])f[j] = max(f[j],f[j - v[i]] + w[i]);}}cout << f[V];return 0;
}
以上是本文全部内容,如果对你有帮助点个赞再走吧~ ₍˄·͈༝·͈˄*₎◞ ̑̑