小猫爬山
内存限制: 256 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
Freda 和 rainbow 饲养了 N 只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。
Freda 和 rainbow 只好花钱让它们坐索道下山。索道上的缆车最大承重量为 W,而 N 只小猫的重量分别是 C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过 W。每租用一辆缆车,Freda 和 rainbow 就要付 1 美元,所以他们想知道,最少需要付多少美元才能把这 N 只小猫都运送下山?
输入格式
第一行包含两个用空格隔开的整数,N 和 W。
接下来 N 行每行一个整数,其中第 i+1 行的整数表示第 i 只小猫的重量 Ci。
输出格式
输出一个整数,最少需要多少美元,也就是最少需要多少辆缆车。
样例
样例输入
复制5 1996
1
2
1994
12
29
样例输出
复制2
(博主吐槽:什么鬼数据,重 1994 是什么鬼)
数据范围与提示
对于100%的数据,1<=N<=18,1<=Ci<=W<=10^8。
石家庄二中【Nescafé 26】杯NOIP模拟赛T1
#include <bits/stdc++.h>
using namespace std;
int n, m, sum;
int a[20], b[20];
void DFS(int x, int y) {
if(y >= sum) {
return;
}
if(x == n + 1) {
sum = min(y, sum);
return;
}
for(int i = 1; i <= y; i++) {
if(a[x] + b[i] <= m) {
b[i] += a[x];
DFS(x + 1, y);
b[i] -= a[x];
}
}
b[y + 1] = a[x];
DFS(x + 1, y + 1);
b[y + 1] = 0;
}
int main() {
scanf("%d %d", &n, &m);
sum = n;
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
sort(a + 1, a + n + 1);
reverse(a + 1, a + n + 1);
DFS(1, 0);
printf("%d\n", sum);
return 0;
}
标签:小猫,Freda,int,题解,sum,样例,C++,缆车
From: https://blog.csdn.net/xxy20110830/article/details/137384211