Acwing 165. 小猫爬山

翰翰和达达饲养了N只小猫,这天,小猫们要去爬山。

经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

翰翰和达达只好花钱让它们坐索道下山。

索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN.

当然,每辆缆车上的小猫的重量之和不能超过W。

每租用一辆缆车,翰翰和达达就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山?

输入格式

第1行:包含两个用空格隔开的整数,N和W。

第2..N+1行:每行一个整数,其中第i+1行的整数表示第i只小猫的重量Ci。

输出格式

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

数据范围

1≤N≤18
1≤Ci≤W≤10^8

输入样例:

5 1996
1
2
1994
12
29

输出样例:

2
难度:简单
时/空限制:1s / 64MB
总通过数:860
总尝试数:2013
来源:《算法竞赛进阶指南》

解题报告:因为这个题目给定的n的数目小,且最后的w可能达到1e8,所以不推荐使用背包来求解,这里采用的是dfs,我们最终的实现目标就是把n只小猫全部运下山的最小的包车数目,所以去dfs每一种可能出现的情况,最后取min值就可以。

//from Onion#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;

int res;
int weight[20];
int now[20];
int n,w;

void dfs(int num,int step)
{
    if(num>=res)
        return;//剪枝优化,当前的包车数目已经比之前的答案还要大了,就没有继续的意义了
    if(step==n+1)
    {
        res=min(res,num);//不断地调整取最优的答案
    }
    for(int i=1;i<=num;i++)
    {
        if(now[i]+weight[step]<=w)//当前的第step只猫看看之前的num个车有没有可以放下去的,如果有,把所有的情况dfs下去
        {
            now[i]+=weight[step];
            dfs(num,step+1);
            now[i]-=weight[step];
        }
    }
    now[num+1]=weight[step];//之前的num个车放不下第step只猫,只好给他单独开一个新车
    dfs(num+1,step+1);
    now[num+1]=0;
    return ;
}
int main()
{
    while(scanf("%d%d",&n,&w)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&weight[i]);
        res=18;
        dfs(1,1);
        printf("%d\n",res);
    }
    return 0;
}

  


原文地址:https://www.cnblogs.com/Spring-Onion/p/12005038.html

时间: 2024-09-30 11:32:59

Acwing 165. 小猫爬山的相关文章

tyvj P2018 「Nescaf&#233;26」小猫爬山 解题报告

P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 描述 Freda和rainbow只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2……CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,Freda和rainb

TyvjP2018 「Nescaf&#233;26」小猫爬山

P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 描述 Freda和rainbow只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2……CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,Freda和rainb

洛谷——P1361 小猫爬山

https://www.luogu.org/problem/show?pid=1361#sub 题目描述 WD和LHX饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了. WD和LHX只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2……CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,WD和LHX就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山? 输入输出格

洛谷 P1361 小猫爬山

题目描述 WD和LHX饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了. WD和LHX只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2……CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,WD和LHX就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山? 输入输出格式 输入格式: 第一行包含两个用空格隔开的整数,N和W. 接下来N行每行一个整数,其中第i+1行

小猫爬山(深搜)

背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 描述 Freda和rainbow只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2--CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,Freda和rainbow就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山? 输入格式 第一行包含两个用空格隔开的整数,N和

小猫爬山

题目描述 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<).Freda和rainbow只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2--CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,Freda和rainbow就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山? 输入 第一行包含两个用空格隔开的整数,N和W.接下

小猫爬山题解(暴力解题)

[问题描述] Freda 和 rainbow 饲养了 N 只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们 终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了. Freda 和 rainbow 只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N 只 小猫的重量分别是C1.C2……CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租 用一辆缆车,Freda 和 rainbow 就要付 1 美元,所以他们想知道,最少需要付多少美元才能 把这 N 只小猫都运送下山? [输入格式] 第一行

CODEVS 4228 小猫爬山

//By DXY 2018.04.27 #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> using namespace std; #defin

【CH2201】小猫爬山

一道很基础的深搜题,数据范围不大,稍加剪枝即可通过. 将重量降序排列,对于已经选了的车,尝试当前的猫能不能坐,如果全部尝试失败,则另用一辆车. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 typedef long long ll; 5 inline int read() { 6 int ret=0,f=1; 7 char c=getchar(); 8 while(c<'0'|