0
点赞
收藏
分享

微信扫一扫

【动态规划笔记】01背包问题

四月天2021 2022-02-07 阅读 44

 

 

  

dp[i][j]:在前i件物品中选出若干件,放入容量为j的背包,能获得的最大价值

 

01背包问题:
dp[n+1][m+1]

memset(dp,0,sizeof(dp));//初始化,将dp全部赋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-w[i]]+c[i],dp[i-1][j]);
cout<<dp[n][m];
#include<iostream>
#include<cstring>
using namespace std;
int dp[31][201];
//dp[i][j]表示选前i件物品重量限制为j的最大价值
//dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i])
int m,n;
int w[31];//重量 
int c[31];//价值 
void input()
{
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>c[i];
	}
}


int main()
{
	input();
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(j>=w[i])
			{
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);
			}
			else
			{
				dp[i][j]=dp[i-1][j];
			}
		}
	}
	cout<<dp[n][m];	 
} 
举报

相关推荐

0 条评论