标签:最小 space 分支 == name oid 需要多少钱 namespace strong
# 题意
运送n个猫下山,每个车上最多承受w重量,n只小猫的重量分别为c1,c2,c3。
每用一辆车需要1元,最少需要多少钱送下所有的猫
N<=18, Ci,W<=1e8
# 题解
n很小所以可以用深搜来做,两个参数,一个记录现在是第几只猫,now另一个记录现在已经开了几辆车,
两个剪枝优化。
如果当前的车的数目已经大于已经得到数目最小值可以终止,
先把重量重的弄上可以减少搜索树分支的数量。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int cat[20]; 4 int car[20]; 5 int n,w; 6 int ans; 7 void dfs(int now,int cnt){ 8 if(cnt>=ans) 9 return; 10 if(now == n+1){ 11 ans=min(ans,cnt); 12 return; 13 } 14 for(int i=1;i<=cnt;i++){ 15 if(car[i]+cat[now]<=w){ 16 car[i]+=cat[now]; 17 dfs(now+1,cnt); 18 car[i]-=cat[now]; 19 } 20 } 21 car[cnt+1]=cat[now]; 22 dfs(now+1,cnt+1); 23 car[cnt+1]=0; 24 } 25 int main(){ 26 cin>>n>>w; 27 for(int i=1;i<=n;i++) 28 cin>>cat[i]; 29 ans=n; 30 dfs(1,0); 31 cout<<ans<<endl; 32 }
标签:最小 space 分支 == name oid 需要多少钱 namespace strong
原文地址:https://www.cnblogs.com/hhyx/p/12401511.html