小貓爬山(深搜)


背景

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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM