背景
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
數據范圍與約定
對於100%的數據,1<=N<=18,1<=Ci<=W<=10^8。
分析:
- 要求最少的纜車數,對於某一狀態,我們關心的就是當前的纜車數,當前的纜車上的載重量以及下一只小貓的數量
- 由於小貓重量越重,就越難拼車,所以先安排重的
- 每次檢索到所有的貓都上了纜車時,更新ans
- 當當前的纜車數已經大於當前的ans,直接結束該搜索,應為之后的情形不會比ans更好
int w,n,c[20],cab[20],ans;
void dfs(int now,int cnt)
{
if(cnt>=ans)
return;
if(now==n+1)
{
ans = min(ans,cnt);
return ;
}
for(int i=1;i<=cnt;i++)
{
if(cab[i]+c[now]<=w)
{
cab[i]+=c[now];
dfs(now+1,cnt);
cab[i]-=c[now];
}
}
cab[cnt+1] = c[now];
dfs(now+1,cnt+1);
cab[cnt+1] = 0;
}
int cmp(int x,int y)
{
return x>y;
}
int main()
{
cin>>n>>w;
for(int i=1;i<=n;i++)
cin>>c[i];
sort(c+1,c+1+n,cmp);
ans = n;
dfs(1,0);
cout<<ans<<endl;
return 0;
}