01背包问题

问题描述

有N件物品和一个容量为V的背包。第i件物品的价值是c[i],重量是w[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。每种物品只有一件,可以选择放或者不放。

思路

首先定义状态转移方程dp[i] [j]为在容量为j的背包中放入前i件物品,所具有的最大价值。

当背包足够装下某一个物品时,对于这个物品都有放与不放两种状态,对应的状态转移方程为:

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

using namespace std;

int n,v,c[1000000],w[1000000];
int dp[105][1005];
int main()
{
cin >> v >> n;
for(int i=1; i<=n; i++)
cin >> c[i] >> w[i];


for(int i=1; i<=n; i++) //物品
for(int j=v; j>=0; j--) //容量
{
if(j >= w[i]) //当背包剩余容量大于此物品时
dp[i][j] = max(dp[i-1][j-w[i]]+c[i], dp[i-1][j]);
else //当背包剩余容量小于此物品时
dp[i][j] = dp[i-1][j];
}
cout << dp[n][v] << endl;
return 0;

}
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 Super Monkey
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信