背包DP题单★

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背包DP题单★相关的知识,希望对你有一定的参考价值。

适合入门的背包DP题单,难度在入门水平。
会持续的更新。

目录

P1048 [NOIP2005 普及组] 采药【0/1背包】


f[i][j] 表示选前i个,体积不超过j的最大价值

#include<bits/stdc++.h> 
using namespace std;
const int M=1e3+10;
const int N=110;
int f[N][M],n,m,v[N],w[N];
int main(void)

	cin>>m>>n;
	for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
	for(int i=1;i<=n;i++)
		for(int j=0;j<=m;j++)
		
			f[i][j]=f[i-1][j];
			if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
		
	cout<<f[n][m];
	return 0;

P1060 [NOIP2006 普及组] 开心的金明【0/1背包】


f[i][j] 表示选前i个,体积不超过j的最大价值

#include<bits/stdc++.h> 
using namespace std;
const int N=27;
const int M=30050;
int f[N][M],v[N],w[N],n,m;
int main(void)

	cin>>m>>n;
	for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
	for(int i=1;i<=n;i++)
	
		for(int j=0;j<=m;j++)
		
			f[i][j]=f[i-1][j];
			if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+v[i]*w[i]);
		
	
	cout<<f[n][m]; 

P1616 疯狂的采药【完全背包】


数据范围很大,选要用一维来优化。

#include<bits/stdc++.h> 
using namespace std;
typedef long long int LL;
const int N=1e7+10;
const int M=1e4+10;
int v[M],w[M],n,m;
LL f[N]; 
int main(void)

	cin>>m>>n;
	for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
	for(int i=1;i<=n;i++)
	
		for(int j=v[i];j<=m;j++) f[j]=max(f[j],f[j-v[i]]+w[i]);
	
	cout<<f[m];
	return 0;

简单的烦恼【简单0/1背包变种】


如果,不考虑它说的那个在规定的时间时,未播放完,播完这首歌的要求。
那么就是一个裸的0/1背包,当考虑条件的时候,贪心的思考,将最长的歌放在最后一秒。
此时我们只需考虑前面的n-1首歌,且时间不超过m-1的最大价值。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N],v[N],t,n,m;
int main(void)

	cin>>t;
	while(t--)
	
		memset(f,0,sizeof f);
		cin>>n>>m;
		for(int i=1;i<=n;i++) cin>>v[i];
		sort(v+1,v+n+1);
		for(int i=1;i<=n-1;i++)
			for(int j=m-1;j>=v[i];j--) f[j]=max(f[j],f[j-v[i]]+v[i]);
		cout<<f[m-1]+v[n]<<endl;
	
	return 0;

以上是关于背包DP题单★的主要内容,如果未能解决你的问题,请参考以下文章

dp--背包--开心的金明

P1064 金明的预算方案 暴力DP 背包

我的DP训练计划: 捆绑背包

洛谷 P1064 金明的预算方案DP/01背包-方案数

Luogu P1060 开心的今明(DP背包)

P1064 [NOIP2006 提高组] 金明的预算方案(背包)