动态规划--01背包问题(c++)

问题描述:

一个旅行者有一个最多能用m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1,C2,…,Cn.若每种物品只有一件求旅行者能获得最大总价值。

输入:

10 4
2 1
3 3
4 5
7 9

输出:

12

问题分析:

所谓01背包问题,意思是每件物品状态只有0和1,也就是选或者不选,且只能选择一次,解题方法与完全背包问题基本一样,区别在于完全背包问题在要选择一件物品时还要判断需要选取几件,也就是以下状态转移方程的区别:
完全背包:
dp[i+1 ][ j ]=max(dp[ i ] [ j ] , dp[ i+1 ] [ j- a[ i ] ]+b [ i ]);
(此处+1表示在选择当前物品时已经选择了一次,从而达到重复选择的目的)
01背包:
dp[ i + 1 ] [ j ]= max ( dp [ i ] [ j ] , dp [ i ] [ j - a [ i ] ] + b [ i ]);

#include
using namespace std;
int main(){
 int m,n;
 cin>>m>>n;
 int a[n],b[n];
 int dp[100][100];
 for(int i=0;i<n;i++){
  cin>>a[i]>>b[i];
 }
 for(int i=0;i<n;i++){
  for(int j=0;j<=m;j++){
   if(a[i]>j) dp[i+1][j]=dp[i][j];
   else
   dp[i+1][j]=max(dp[i][j],dp[i][j-a[i]]+b[i]);
  }
 }
 cout<<dp[n][m];
} 

你可能感兴趣的:(动态规划--01背包问题(c++))