目录
视频链接哈哈哈,不过不管怎么说,我还是喜欢二维数组来做,模型其实很固定
洛谷试练场 普及组 动态规划的背包问题_哔哩哔哩_bilibili
洛谷试练场 普及组 动态规划的背包问题_哔哩哔哩_bilibili
其实都是模板,我还是二维数组,不过这个应该一维数组更方便欸、
P1466 [USACO2.2]集合 Subset Sums
P1048 [NOIP2005 普及组] 采药
思路
01背包问题【思路可以看哔哩哔哩视频哈】
附上视频链接吧
动态规划DP0-1背包_哔哩哔哩_bilibili 【这个是我觉得最清楚最基础的视频】
洛谷试练场 普及组 动态规划的背包问题_哔哩哔哩_bilibili【题目来源哦】
代码实现【菜鸟本鸟自己写的】
#include<bits/stdc++.h>
using namespace std;
int dp[105][1005];
int main()
{
int t,m,i,j;
int ti[105]={0},vi[105]={0};
scanf("%d %d",&t,&m);
for(i=1;i<=m;i++)
scanf("%d %d",&ti[i],&vi[i]);
for(i=1;i<=m;i++)
{
for(j=1;j<=t;j++)
{
if(ti[i]>j)
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-ti[i]]+vi[i]);
}
}
printf("%d\n",dp[m][t]);
return 0;
}
P1060 [NOIP2006 普及组] 开心的金明
思路
跟01背包一样,没什么区别哦
视频链接哈哈哈,不过不管怎么说,我还是喜欢二维数组来做,模型其实很固定
洛谷试练场 普及组 动态规划的背包问题_哔哩哔哩_bilibili
代码实现
#include<bits/stdc++.h>
using namespace std;
int dp[26][30005];
int v[26],w[26];
int main()
{
int i,j,n,m;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d %d",&v[i],&w[i]);
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(v[i]>j)
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]*v[i]);
}
}
printf("%d",dp[m][n]);
return 0;
}
P1049 [NOIP2001 普及组] 装箱问题
思路
洛谷试练场 普及组 动态规划的背包问题_哔哩哔哩_bilibili
其实都是模板,我还是二维数组,不过这个应该一维数组更方便欸、
代码实现
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int dp[35][20005];
int v[35];
int main()
{
int n,m,i,j;
scanf("%d",&m);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(v[i]>j)
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+v[i]);
}
}
if(dp[n][m]>=m) printf("0\n");
else printf("%d\n",m-dp[n][m]);
return 0;
}