luogu P1361 小猫爬山 [iddfs]
生活随笔
收集整理的這篇文章主要介紹了
luogu P1361 小猫爬山 [iddfs]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
WD和LHX飼養了N只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終于爬上了山頂,但是疲倦的它們再也不想徒步走下山了。
WD和LHX只好花錢讓它們坐索道下山。索道上的纜車最大承重量為W,而N只小貓的重量分別是C1、C2……CN。當然,每輛纜車上的小貓的重量之和不能超過W。每租用一輛纜車,WD和LHX就要付1美元,所以他們想知道,最少需要付多少美元才能把這N只小貓都運送下山?
輸入輸出格式
輸入格式:
第一行包含兩個用空格隔開的整數,N和W。
接下來N行每行一個整數,其中第i+1行的整數表示第i只小貓的重量C i。
輸出格式:
輸出一個整數,最少需要多少美元,也就是最少需要多少輛纜車。
輸入輸出樣例
輸入樣例#1:5 1996 1 2 1994 12 29 輸出樣例#1:
2
說明
數據范圍與約定
對于100%的數據,1<=N<=18,1<=C i <=W<=10^8。
?
My Solution
都已經是蒟蒻了solution寫長一點吧
迭代加深排序iddfs的膜版之一,k從sum(data[0],data[1],...,data[n-1])/q到n之間
k表示最小可行答案(就是最后的答案啦)
注意data[0...n-1]從小到大排序
結果還是很短啊
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 inline int read(){ 8 char ch; 9 int re=0; 10 while((ch=getchar())<'0'||ch>'9'); 11 re=ch-'0'; 12 while((ch=getchar())>='0'&&ch<='9') re=re*10+ch-'0'; 13 return re; 14 } 15 16 const int maxn=19; 17 int data[maxn]; 18 int q,n; 19 int k=0; 20 bool ok=0; 21 int car[maxn]={0}; 22 23 void init(){ 24 n=read(),q=read(); 25 for(int i=0;i<n;i++){ 26 data[i]=read(); 27 k+=data[i]; 28 } 29 k/=q; 30 } 31 32 void iddfs(int pos){ 33 if(pos==n){ 34 ok=1; 35 return; 36 } 37 for(int i=1;i<=k;i++) 38 if(car[i]+data[pos]<=q){ 39 car[i]+=data[pos]; 40 iddfs(pos+1); 41 car[i]-=data[pos]; 42 if(ok) return; 43 } 44 } 45 46 inline bool compp(const int &n1,const int &n2){ 47 return n1>n2; 48 } 49 50 void solve(){ 51 sort(data,data+n,compp); 52 while(k<=n){ 53 iddfs(0); 54 if(ok){ 55 printf("%d\n",k); 56 return; 57 } 58 k++; 59 } 60 } 61 62 int main(){ 63 //freopen("temp.in","r",stdin); 64 init(); 65 solve(); 66 return 0; 67 }別害怕別害怕 ?只是悲歡離合的夢啊
轉載于:https://www.cnblogs.com/ZYBGMZL/p/6857434.html
總結
以上是生活随笔為你收集整理的luogu P1361 小猫爬山 [iddfs]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这不是bug,而是语言特性
- 下一篇: IDA Pro的patch插件 KeyP