⬅ 返回

闫氏DP分析法

1、数据结构

2、例题

3、代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define PI 3.14159
using namespace std;
 
typedef pair<int,int> PII;
typedef long long LL;
const int MAX_INT =  0x3f3f3f3f;
const int N = 1e3+15;
const int mod = 1e9+7;
int dp[N][N];//dp[i][j]指的是前i件物品在容量为j的条件下最大价值
int V[N];//第i件物品的体积
int W[N];//第i件物品的价值
 
void solve()
{
	int n,v;
	cin>>n>>v;
	for(int i=1;i<=n;i++)
	{
		int a,b;
		cin>>a>>b;
		V[i]=a;
		W[i]=b;
	}
	----------------------------------------------------
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=v;j++)
		{
			if(V[i]<=j)//如果放得下当前物品
			{
				//取
				//前i-1件物品在容量j条件下的最大价值dp[i-1][j]
				//和前i-1件物品在容量j-v[i]条件下的价值加上w[i]的价值dp[i-1][j-V[i]]+W[i]
				//中的最大值
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-V[i]]+W[i]);
			}else{//放不下第i件物品
				dp[i][j]=dp[i-1][j];//前i件物品在容量j条件下的最大价值 就等于 前i-1件物品最大价值
			}
			
		}
	}
-----------------------------------------------------------	
	cout<<dp[n][v]<<endl;
 
}
 
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
 
    int T = 1;
    while(T--)
    {
        solve();
    }
}

01背包的一维数组优化

1、分析

为什么可以转为一维

为什么要逆序

2、代码

#include <iostream>
using namespace std;
 
int n,V;
const int N = 1e3+10;
int v[N] , w[N];
int dp[N];//dp[j]表示当空间最大为j所能容纳的最大价值
 
int main()
{
    cin>>n>>V;
    for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
 
    for(int i=1;i<=n;i++)
    {
        for(int j=V;j>=v[i];j--)//只有当枚举的背包容量j >= v[i] 时才会更新状态,
        {
            dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        }
    }
    cout<<dp[V]<<endl;
 
}