之前做過一道題「破鑼搖滾樂隊」,把貓都編了號,每輛車只能裝一些編號遞增的貓,而且前一輛車的貓編號都比後一輛車小。那道題的dp狀態是:f[i][j]表示裝了前i只貓,使用了j輛車時第j輛車所剩空間的最大值。轉移時,考慮第i只貓是新坐一輛車(從f[i-1][j-1]轉移)還是坐第j輛車剩下的空位(從f[i-1][j]轉移),當然要從某個子狀態轉移過來,必須保證這個子狀態是存在的(f[i][j]存在就是說j輛車能夠塞下前i只貓)
這個題,沒有順序的限制,所以無法直接套用那道題的狀態。但n<=18,可以狀態壓縮。f[s][j]表示集合s中的貓坐在前j輛車中時,第j輛車剩下的最大空間。轉移時列舉s中每乙隻貓即可。(不妨認為我們是從第一輛車開始依次裝貓,裝到第j輛的時候前面j-1輛車就不再考慮了)。最後從小到大找可行狀態。
不過狀態總數高達18*2^18,狀態轉移需要o(n),也就是說,總的時間複雜度為18*18*2^18,好虛....所幸,這個方法的特點是:對於相同的n,任何輸入的迴圈次數相同,所以我在自己的電腦上隨便造了一組n=18的資料。測試結果表明,1s內完全可以出解,所以就放心交上去了2333。確實能過,不過時間被搜尋虐爆了....
#include#include#includeint f[1<<18][19];//about 5 mibint a[20];
int max(int a,int b)
int main()}}
}for(int i=1;i<=n;++i)
}// double t2=clock();
// printf("%.3fs\n",(t2-t1)/clocks_per_sec);
return 0;
}
小貓爬山(dfs)
時間限制 1 sec 記憶體限制 128 mb 題目描述 freda和rainbow飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 freda和rainbow只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分...
小貓爬山(搜尋)
題目描述 freda和rainbow飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 freda和rainbow只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重...
AcWing 小貓爬山
翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...