翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。
經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了(嗚咕》_<)。
翰翰和達達只好花錢讓它們坐索道下山。
索道上的纜車最大承重量為w,而n只小貓的重量分別是c1、c2……cnc1、c2……cn。
當然,每輛纜車上的小貓的重量之和不能超過w。
每租用一輛纜車,翰翰和達達就要付1美元,所以他們想知道,最少需要付多少美元才能把這n只小貓都運送下山?
輸入格式
第1行:包含兩個用空格隔開的整數,n和w。
第2..n+1行:每行乙個整數,其中第i+1行的整數表示第i只小貓的重量cici。
輸出格式
輸出乙個整數,表示最少需要多少美元,也就是最少需要多少輛纜車。
資料範圍
1≤n≤181≤n≤18,
1≤ci≤w≤1081≤ci≤w≤108
輸入樣例:
5 199612
1994
1229
輸出樣例:
2
狀態壓縮dp
orz! daolao的部落格如下
#include #include #include using namespace std;
int n, w[19], f[20][1<<19], w;
int main()
}if( f[i][(1把這些貓裝到纜車裡,纜車有重量限制。
每只貓有兩種決策,裝到已有的車中,新開一輛車來裝它。
排序先選重量大的貓,這樣後邊的貓的決策就少了,讓搜尋樹靠近根節點的分支就減少了。
#include#define ll long long
#define ull unsigned long long
#define maxn (ll)1e5
#define inf 0x3f3f3f3f
#define inf 0x7fffffff
#define pi acos(-1.0)
#define pb push_back
#define re register
const double eps = 0.0000001;
using namespace std;
typedef pairpii;
inline ll sgn(double x)
ll ans[maxn],n,m;
ll f[maxn];
ll res = inf;
void dfs(ll idx,int num)
for(int i = 0;i>n>>m;
for(int i = 1;i<=n;++i)
sort(ans+1,ans+n+1,greater());//從大到小排序,優先選擇決策少的
dfs(1,0);
cout<}
ACWING165 小貓爬山(dfs)
翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...
Acwing165 DFS 小貓爬山
165.小貓爬山 acwing題庫 題解 因為 n nn 很小,所以我們可以暴力列舉所有情況 那麼,我們要考慮的問題是搜尋的順序,dfs函式的引數 搜尋的順序 對於每個小貓,我們有兩種決策 如果當前的車超重,把它放到新的車中 函式引數 對於引數,定義dfs int u int k 保證了所有情況都可...
ACWing 165 小貓爬山 DFS剪枝
翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...