1、 用乙個陣列,cab[maxn], 記錄每一輛車上所有貓的重量;
void dfs(int now, int cnt) //now 表示當前已經有多少只貓上車,車的數量是 cnt;
cab[i] += cat[now]; //選擇某一輛車 cab[i] 輛裝當前貓 cat[now]
dfs(now + 1, cnt); //遞迴
cab[i] -= cat[now]; //遞迴出來,車 cab[i] 輛不裝當前貓 cat[now]
2、 先排序,從大到小,優先安排重量大的貓上車;
3、 對於cnt >= ans 時候,就沒有必要進行了。
#include
#include
#include
#include
using
namespace std;
const
int maxn =20;
int cat[maxn]
;int cab[maxn]
;// 記錄每一輛車上所有貓的重量
int n, w;
int ans =
0x3f3f3f3f
;bool
cmp(
int a,
int b)
void
dfs(
int now,
int cnt)
//now 表示當前已經有多少只貓上車,車的數量是 cnt
if(now == n +1)
// 在 1 ~ cnt 輛纜車選擇一輛來放 cat[now]
for(
int i =
1; i <= cnt;
++i)
}// 增加一輛新車來放 cat[now]
cab[cnt +1]
= cat[now]
;dfs
(now +
1, cnt +1)
; cab[cnt +1]
=0;}
void
solve()
intmain()
solve()
;return0;
}/*5 199612
1994
1229
*//*
2*/
CH2201 小貓爬山
一道很基礎的深搜題,資料範圍不大,稍加剪枝即可通過。將重量降序排列,對於已經選了的車,嘗試當前的貓能不能坐,如果全部嘗試失敗,則另用一輛車。1 include 2 include 3 include 4 typedef long long ll 5 inline int read 9while c ...
CH2201 小貓爬山 DFS
設狀態為 no w,cn t now,cnt now,c nt now nowno w 表示當前要分配第幾隻貓,cnt cntcn t 表示已經租用了多少輛纜車 同時記錄下每輛纜車的重量情況,dfs即可。當前 cnt cntcn t 若大於等於已求的答案,直接返回 按重量給貓排序,先放重量大的。in...
《演算法競賽高階指南》小貓爬山
翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...