本题背景有意思,大家当乐子看,目前没有找到题目原题,也没有写过完全是01背包模板的题目,该篇文章大家注意其01背包一维写法的模板就好,注意各个关键点
✨欢迎来到脑子不好的小菜鸟的文章✨
🎈创作不易,麻烦点点赞哦🎈
我的主页:脑子不好的小菜鸟-CSDN博客
文章特点:关键点和步骤讲解放在
代码相应位置
我会陆续发布算法题题解,感兴趣的可以关注哦
01背包-协会传说
协会里有个传奇人物罗超人 罗神就是22级算法组的天花板!!! ✨❤是银河中滚烫的星辰❤✨ ✨❤是努力又向上的绝佳代表❤✨ ✨❤同火焰一同迸发❤✨ ✨❤是偶然坠入凡间的天使泪滴❤✨ 只学过一天编程的罗超人就是22级软工第一巨巨!!!
__ __ __ __ ____ ____ \ \ / / \ \ / / | _ \ / ___| \ V / \ V / | | | | \___ \ | | | | | |_| | ___) | |_| |_| |___ / |____/
罗神敲代码很强,也很爱玩游戏,罗神巨爱玩和平暖暖,开局就直接跳机场。 罗神落在了C字楼的一号楼,因为机场人很多,罗神很快的就跑到了一个房间里。 房间里有n(n<=1e4)个配件,每个配件有c(c<=1e4)的重量和v(v<=1e4)的价值, 但罗神捡了一个2级包,容量为s,所以罗神最多当多肥的人坤呢?
Input
输入的第一行是T, 表示罗神一共要落地成盒T次 每组数据由三行组成. 第1行包含两个整数n和s . 第2行包含n个整数, 表示每一个配件的价值. 第3行包含n个整数, 表示每个配件的重量.
Output
对每一组数据, 输出罗神可以当多肥的人坤.
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
思路:
为什么是01背包呢?
因为题目是啊,因为配件只要一个就够了,所以每个物品只能取一次----->01背包
物品:配件
背包:二级包的容量:S
该题我用的是一维数组的01背包模板(滚动数组)(比二维数组更节省空间),注意一维数组的外循环为物品(i),内循环为背包容量(j),且不可更改内外循环的顺序,且内循环只可逆序,不可正序,否则每个物品不满足只取一次的条件。
AC代码
#include <iostream>
#include <vector>
#include <algorithm>/*max函数所在头文件*/
#define quickio ios::sync_with_stdio,cin.tie(0),cout.tie(0);
using namespace std;
//01背包-协会传说
const int vn = 1e4 + 5;
const int wn = 1e4 + 5;
//确定dp数组含义
int n, s, v[vn] = { 0 }, w[wn] = { 0 }, i, j, dp[wn] = { 0 };//dp[i]:当容量为i时可拿到的最大价值
int main()
{
quickio;
int t;
cin >> t;
while (t--)
{
memset(dp, 0, sizeof dp);
cin >> n >> s;
for (i = 0; i < n; i++)
{
cin >> v[i];
}
for (i = 0; i < n; i++)
{
cin >> w[i];
}
for (i = 0; i < n; i++)//物品:该题为配件
{
for (j = s; j >= w[i]; j--)//背包容量:该题为二级包容量
{//注意是逆序,若为正序则一个物品不止取一次
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);//01背包的常用递推公式
}
}
printf("%d\n", dp[s]);
}
return 0;
}
最后祝大家题题AC,只盼做个WA梦 ~