首页 > 其他 > 详细

闫氏DP分析法——01背包为例

时间:2021-05-13 20:17:04      阅读:23      评论:0      收藏:0      [点我收藏+]

闫氏DP分析法

DP问题没有固定的模板,和贪心一样是一种思想。下面是DP问题的常用分析套路:

01背包

很早之前写过关于01背包的题解,但是当时的理解很杂乱。这次用Y总的方法重新理解这个问题,感觉比较清晰。
直接上代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 1010;

int n,m; //n 物品数量 m 背包容量 
int v[N],w[N]; //v 体积 w 价值 
int f[N][N]; //f 状态 

int main(){
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
	
	//f[0][0-m] = 0; 全局变量默认初始化
	for (int i = 1; i <= n; i ++ )
		for (int j = 0; j <= m; j ++ )
		{
		 	f[i][j] = f[i-1][j]; //  不含i 
		 	if (j >= v[i]) //背包容量j可以放下v[i] 
	 		f[i][j] = max(f[i][j],f[i - 1][j - v[i]] + w[i]);
		}
			
	cout << f[n][m] << endl;
	
    return 0;
}

上述代码还可以优化,利用滚动数组优化成一维。
在求f[i]层只用到了f[i-1]层,并且它们的j值为j、j-v[i]都小于等于j。

技术分享图片

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 1010;

int n,m; //n 物品数量 m 背包容量 
int v[N],w[N]; //v 体积 w 价值 
int f[N]; //f 状态 

int main(){
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
	
	for (int i = 1; i <= n; i ++ )
		for (int j = m; j >= v[i]; j -- )
		{
		 	//f[j] = f[j]
		 	//if (j >= v[i]) //背包容量j可以放下v[i] 
	 		f[j] = max(f[j],f[j - v[i]] + w[i]);
		}
			
	cout << f[m] << endl;
	
    return 0;
}

闫氏DP分析法——01背包为例

原文:https://www.cnblogs.com/lijiaji/p/14764593.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!