背包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题单★的主要内容,如果未能解决你的问题,请参考以下文章