【NOIP2013模拟】小猫爬山

来源:互联网 发布:穿衣服的软件 编辑:程序博客网 时间:2024/04/27 10:22
【NOIP2013模拟】小猫爬山
Description
Freda和rainbow饲养了N只小猫,这天们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下(呜咕>_<>_<)。
Freda和rainbow只好花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N只小猫的重量分别是 C1、C2…… CN。当然,每辆缆车上的小猫重量之和不能超过W。每 租用一辆缆车,Freda和rainbow就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山?

Input
第一行包含两个用空格隔开的整数,N和W。
接下来N行每一个整数,其中第 i+1行的整数表示第i只小猫的重量Ci。

Output
输出 一个整数,最少需要多美元也就是辆缆车 。

Sample Input
5 1996
1
2
1994
12
29

Sample Output
2

Data Constraint

对于100%的数据,1<=N<=18,1<=Ci<=W<=10^8



这道题其实看起来好像挺难的样子,但是我们转眼看看数据范围1<=N<=18,1<=Ci<=W<=10^8,头上的天空就顿时晴朗了起来——倘若你想到了——这是道水题。

这题的正解就是——brute force(暴力)+dfs。

解题思路是这样的:这一题如果我们用递归枚举一只猫坐上的缆车,我们可以得出,倘若第i只猫坐在第j辆缆车上,那么一定有i>=j
那么,代码就分为以下几个步骤:
    1.首先从小到大枚举要用的缆车数量,for i=1 to n。
    2.递归枚举每只猫所乘坐的缆车,参数x为当前猫的序号,for o=1~min(x,i),用一个f数组表示第i个缆车所乘猫的总重量,倘若c[x]+f[i]<w,那么递归下去。
    3.倘若枚举完了所有猫,意味着当前所用的缆车个数符合条件,直接输出。
    (此题为迭代深搜的题目)

那么这道题就可以轻轻松松地拿到100了。

据说有一种水法可以水过数据——切猫溶车法。(sum+w-1)div w{sum为所有猫的总重}

codes:

var
    f,a:array[0..30]of longint;
    n,w,i,h,t:longint;
procedure dg(x:longint);
    var o:longint;
begin
    if x>n then
    begin
        writeln(i);
        halt;
    end;
    for o:=1 to i do
    begin
        if o>x then break;
        if w>=f[o]+a[x] then
        begin
            inc(f[o],a[x]);
            dg(x+1);
            dec(f[o],a[x]);
        end;
    end;
end;
begin
    read(n,w);
    for i:=1 to n do read(a[i]);
    h:=1; t:=n;
    for i:=1 to n do dg(1);
    writeln(i);
end.




0 0