01背包问题动态规划 c++
时间: 2023-11-09 14:03:41 浏览: 100
好的,针对您的问题,以下是 01 背包问题的动态规划解法的 C++ 代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N][N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
for (int i = 1; i <= n; i ++ )
for (int j = 0; j <= m; j ++ )
{
f[i][j] = f[i - 1][j];
if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
cout << f[n][m] << endl;
return 0;
}
```
相关问题
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` 时的最大价值。
阅读全文