洛谷1049 装箱问题 解题报告
洛谷1049 装箱问题
本题地址: http://www.luogu.org/problem/show?pid=1049
题目描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入输出格式
输入格式:
一个整数,表示箱子容量
一个整数,表示有n个物品
接下来n行,分别表示这n 个物品的各自体积
输出格式:
一个整数,表示箱子剩余空间。
输入输出样例
输入样例#1:
24 6 8 3 12 7 9 7
输出样例#1:
0
说明
NOIp2001普及组 第4题
题解
动态规划
01背包的变式题。
只需在01背包思想的基础上,把物品的体积同时看做物品的价值,最后用箱子的容积减去最大体积,即可解决此问题。
我们可以得到状态转移方程:f[j]:=max{f[j],f[j-a[i]]+a[i]};
初始:f[j]=0;
目标:v-f[v]。
下面附上代码。
代码
- var
- v,n,i,j:longint;
- a:array[1..30] of longint;
- f:array[0..20000] of longint;
- function max(x,y:longint):longint;
- begin
- if x>y then exit(x)
- else exit(y);
- end;
- begin
- readln(v);
- readln(n);
- for i:=1 to n do
- readln(a[i]);
- for i:=1 to n do
- for j:=v downto a[i] do
- f[j]:=max(f[j],f[j-a[i]]+a[i]);
- writeln(v-f[v]);
- end.
(本文系笔者原创,未经允许不得转载)
博文系博主原创,转载请注明出处 o(* ̄▽ ̄*)ブ 更多博文源自https://www.cnblogs.com/yzm10