题目描述
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
#include<bits/stdc++.h>
using namespace std;
int sum,c[1000],a[1000],n,ans;//sum是记录第k次搜索时租用的缆车数量,ans是最后输出的缆车最小值
//数组a[i]表示第i个缆车目前搭载的总重量
long long int w;
void dfs(int k)//每一次深搜都代表一只猫的选择
{
if(sum>=ans)return;//剪枝,如果目前没有分配完猫的缆车数量大于等于已经分配完猫的缆车数量
//直接返回,数量大了,再进行下去没有意义。
if(k>n)
{
ans=min(ans,sum);//比较得出最小缆车数量
return;
}
for(int i=0;i<sum;i++)
{
if(a[i]+c[k]<=w)//第i辆车上目前重量加上第k只猫的重量如果小于等于缆车的最大载重量
{
a[i]+=c[k];//先假设第k只猫上了第i辆车
dfs(k+1);//去分析第k+1只猫
a[i]-=c[k];//第k只猫如果没有上第i辆车
}
}
//第k只猫没有上第i辆车的话,再租用一辆缆车用来装第k只猫
a[sum++]=c[k];
dfs(k+1);//再去分析第k+1只猫
a[sum--]=0;
}
int main()
{
scanf("%d%lld",&n,&w);
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);//scanf比cin更快一些
ans=n;
dfs(1);
cout<<ans<<endl;
return 0;
}
博主能力有限,如果有不对的地方请多多包涵