Freda 和 rainbow 饲养了 N 只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们 终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(555……)。
Freda 和 rainbow 只好花钱让它们坐索道下山。索道上的缆车最大承重量为 W,而 N 只 小猫的重量分别是 C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过 W。每 租用一辆缆车,Freda 和 rainbow 就要付 1 美元,所以他们想知道,最少需要付多少美元才 能把这 N 只小猫都运送下山?
输入
第一行包含两个用空格隔开的整数,N 和 W。
接下来 N 行每行一个整数,其中第 i+1 行的整数表示第 i 只小猫的重量 C i。
输出
输出一个整数,最少需要多少美元,也就是最少需要多少辆缆车
样例
样例输入1
5 1996 1 2 1994 12 29
样例输出1
2
tips: 对于 100%的数据,1<=N<=18,1<=C i <=W<=10^8。
code:
#include <bits/stdc++.h> using namespace std; int ans,n,w,arr[20],sum[20]; void dfs(int u,int k){ if(k > ans) return; if(u == n+1){ ans = k; return; } for(int i = 1;i<=k;i++){ if(arr[i] + sum[u] <= w){ arr[i] += sum[u]; dfs(u+1,k); arr[i] -= sum[u]; } } arr[k+1] = sum[u]; dfs(u+1,k+1); arr[k+1] = 0; } int main(){ cin>>n>>w; for(int i = 1;i<=n;i++) cin>>sum[i]; sort(sum+1,sum+1+n,greater<int>()); ans = n; dfs(1,1); cout<<ans; }
标签:小猫,int,sum,爬山,样例,缆车,ans From: https://www.cnblogs.com/nasia/p/17241259.html