解题报告:因为这个题目给定的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;
}