1. 程式人生 > >2018.11.5 Nescafe26 T1 小貓爬山

2018.11.5 Nescafe26 T1 小貓爬山

題目

題目描述

Freda 和 rainbow 飼養了 N 只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們 終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了(嗚咕>_<)。

Freda 和 rainbow 只好花錢讓它們坐索道下山。索道上的纜車最大承重量為 W,而 N 只 小貓的重量分別是 C1、C2……CN。當然,每輛纜車上的小貓的重量之和不能超過 W。每 租用一輛纜車,Freda 和 rainbow 就要付 1 美元,所以他們想知道,最少需要付多少美元才 能把這 N 只小貓都運送下山?

輸入格式

第一行包含兩個用空格隔開的整數,N 和 W。

接下來 N 行每行一個整數,其中第 i+1 行的整數表示第 i 只小貓的重量 C i。

輸出格式

輸出一個整數,最少需要多少美元,也就是最少需要多少輛纜車。

樣例輸入

5 1996

1

2

1994

12

29

樣例輸出

2

資料範圍及約定

對於 100%的資料,1<=N<=18,1<=C i <=W<=10^8。

解法

很正常的迭代加深。因為n很小所以沒必要二分。

程式碼

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAXN 20

int
n, w; int c[MAXN], sum; bool flg; int lc[MAXN], ans; void dfs(int x) { if(x == n + 1) { flg = true; return; } for(int i = 1; i <= ans; ++i) { if(c[x] + lc[i] <= w) { lc[i] += c[x]; dfs(x + 1); lc[i] -= c[x];
if(flg) return; } } } bool cmp(int a, int b) { return a > b; } int main() { freopen("catclimb.in", "r", stdin); freopen("catclimb.out", "w", stdout); scanf("%d%d", &n, &w); for(int i = 1; i <= n; ++i) { scanf("%d", &c[i]); sum += c[i]; } sort(c + 1, c + n + 1, cmp); for(ans = sum / w; ans <= n; ++ans) { dfs(1); if(flg) { printf("%d\n", ans); return 0; } } fclose(stdin); fclose(stdout); return 0; }
程式碼