完全背包笔记【优化】

优化后的完全背包

PS:DP优化的根本就是等价变形

AcWing链接

优化前

#include <bits/stdc++.h>
using namespace std;

int n,v;
int c[1005],w[1005];
int f[1005][1005]; 

int main()
{
	scanf("%d%d",&n,&v);
	for(int i=1; i<=n; i++)
	{
		scanf("%d%d",&w[i],&c[i]);
	}
	//输入

	for(int i=1; i<=n; i++)
	{
		for(int j=1;j<=v; j++)
		{
			f[i][j]=f[i-1][j];
			if(j>=w[i]) 
			{
				f[i][j]=max(f[i][j],f[i][j-w[i]]+c[i]);
			}
		}
	}
	//核心代码
	
	printf("%d",f[n][v]); 
	
	return 0;
}

运行时间: 76 ms
运行空间: 4336 KB


优化与优化前对照代码:

#include <bits/stdc++.h>
using namespace std;

int n,v;
int c[1005],w[1005];
int f[1005][1005]; 

int main()
{
	scanf("%d%d",&n,&v);
	for(int i=1; i<=n; i++)
	{
		scanf("%d%d",&w[i],&c[i]);
	}
	//输入

	for(int i=1; i<=n; i++)
	{
		for(int j=1;j<=v; j++)
		{
			f[i][j]=f[i-1][j];
			if(j>=w[i]) 
			{
				f[i][j]=max(f[i][j],f[i][j-w[i]]+c[i]);
			}
		}
	}
	//核心代码
	
	printf("%d",f[n][v]); 
	
	return 0;
}

优化后完整代码

#include <bits/stdc++.h>
using namespace std;

int n,v;
int c[1005],w[1005];
int f[1005]; 

int main()
{
	scanf("%d%d",&n,&v);
	for(int i=1; i<=n; i++)
	{
		scanf("%d%d",&w[i],&c[i]);
	}
	//输入

	for(int i=1; i<=n; i++)
	{
		for(int j=w[i];j<=v; j++)
		{
			f[j]=max(f[j],f[jw[i]]+c[i]);
		}
	}
	//核心代码
	
	printf("%d",f[v]); 
	
	return 0;
}

运行时间: 36 ms
运行空间: 216 KB

优化前后时间、空间对比极大QAQ…

posted @ 2020-04-27 22:41  BorisDimitri  阅读(62)  评论(0编辑  收藏  举报