背包问题c++代码
时间: 2023-07-07 20:05:58 浏览: 61
以下是一个简单的 01 背包问题的 C++ 代码实现:
```c++
#include<bits/stdc++.h>
using namespace std;
int main(){
int N, W;
cin >> N >> W; // N 个物品,背包容量为 W
vector<int> w(N+1), v(N+1); // 物品的重量和价值
for(int i = 1; i <= N; i++){
cin >> w[i] >> v[i];
}
vector<vector<int>> dp(N+1, vector<int>(W+1, 0)); // dp 数组初始化
for(int i = 1; i <= N; i++){
for(int j = 1; j <= W; j++){
if(j >= w[i]){ // 能放下第 i 个物品
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
}else{ // 放不下第 i 个物品
dp[i][j] = dp[i-1][j];
}
}
}
cout << dp[N][W] << endl; // 输出最大价值
return 0;
}
```
该代码使用二维的 dp 数组存储状态,其中 `dp[i][j]` 表示前 i 个物品放入容量为 j 的背包中所能获得的最大价值。时间复杂度为 $O(NW)$,空间复杂度也为 $O(NW)$。
阅读全文