01背包之---------装箱问题
在上一次的讲解,我们明白了什么是01背包,这次来看题
先看一道水题
1350: 装箱问题
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 835 Solved: 455
Description
有一个箱子容量为v(正整数,0≤v≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。
要求从m个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
要求从m个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
Input
第一行,一个整数v,表示箱子容量;
第二行,一个整数,表示有n个物品;
接下来n行,每行一个数,分别表示这n个物品的各自体积。
第二行,一个整数,表示有n个物品;
接下来n行,每行一个数,分别表示这n个物品的各自体积。
Output
输出一行,一个整数,表示箱子剩余空间。
Sample Input
24
6
8
3
12
7
9
7
Sample Output
0,
解释一下样例
他要先输入一个
v表示总体积
n表示总个数
int w; scanf("%d%d", &w, &n); int i, j; for (i = 0; i < n; i++){ scanf("%d", &a[i]);//输入 }
让你用这n个数,尽量去凑v,这就用到了01背包的思想,枚举,一个个的试嘛
可以先用sort排个序(一般不用),在用memset
memset(d, 0, sizeof(d));
然后就是代码的核心部分
开始枚举
for (i = 0; i < n; i++){ for (j = w; j >= a[i]; j--) d[j] = max(d[j], d[j - a[i]] + a[i]);//上节讲的最基本的公式 } printf("%d\n", w - d[w]);//注意是输出w-d[w];
好了这道题就结束了
很基础的板子题
下一节继续讲01背包的练习
版权声明:本文为kevin6666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。