01背包问题动态规划C++
时间: 2024-05-07 19:14:53 浏览: 96
01背包问题是一种经典的动态规划问题,它的目标是在背包容量一定的情况下,选择不同的物品,使得装入背包中的物品总价值最大。C++实现的思路如下:
1.定义一个dp数组,其中dp[i][j]表示容量为j时前i个物品的最大价值。
2.使用for循环遍历每一个物品,再使用另一个for循环遍历每一个容量,通过比较是否将当前物品放入背包中能够获得更大的价值,来更新dp数组中对应位置的值。
3.最后dp[n][V]就是容量为V时前n个物品的最大价值。
以下是C++代码实现:
```
int knapsack(int V, int n, int* w, int* v) {
int dp[n + 1][V + 1];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= V; j++) {
if (w[i - 1] > j) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = max(dp[i - w[i - 1]] + v[i - 1]);
}
}
}
return dp[n][V];
}
```
相关问题
01背包问题动态规划c++
01背包问题是经典的动态规划问题,以下是C++代码实现:
```c++
#include<bits/stdc++.h>
using namespace std;
int n, m;//n为物品数量,m为背包容量
int w[1010], v[1010];//w为物品重量,v为物品价值
int f[1010][1010];//f[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>w[i]>>v[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j<w[i]) f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
}
}
cout<<f[n][m]<<endl;//输出最大价值
return 0;
}
```
代码中的f[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。当第i个物品的重量大于当前背包容量j时,不放入该物品,背包中物品价值不变。当第i个物品的重量小于等于当前背包容量j时,可以选择放入该物品或者不放入该物品,取两者的最大值作为当前背包容量下的最大价值。最终输出f[n][m]即为最大价值。
01背包问题动态规划c++代码
以下是 01背包问题 的动态规划的 C 代码实现:
```c
#include <stdio.h>
#define N 1000
#define W 10000
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, m;
int w[N], v[N];
int dp[N][W];
// 输入物品数量和背包容量
scanf("%d%d", &n, &m);
// 输入每个物品的重量和价值
for (int i = 1; i <= n; i++) {
scanf("%d%d", &w[i], &v[i]);
}
// 初始化
for (int i = 0; i <= m; i++) {
dp[0][i] = 0;
}
// 动态规划
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (j < w[i]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
}
// 输出结果
printf("%d\n", dp[n][m]);
return 0;
}
```
其中,`n` 表示物品数量,`m` 表示背包容量,`w[i]` 表示第 `i` 个物品的重量,`v[i]` 表示第 `i` 个物品的价值,`dp[i][j]` 表示在前 `i` 个物品中选择,且背包容量为 `j` 时的最大价值。
阅读全文