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];
}