CODEVS 4228 小貓爬山
阿新 • • 發佈:2018-08-25
class amp scanf clas oid 處理 圖片 isp img
//By DXY 2018.04.27 #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> using namespace std; #define maxn 100000 int n,m,ans; int d[maxn],v[maxn];View Codevoid dfs(int now,int cnt)//處理第now只貓,已經租了cnt輛車 { if(cnt>=ans)//剪枝,不可能更新最優解 { return ; } if(now==n+1)//比較並更新最優解 { ans=min(ans,cnt); return ; } for(int i=1;i<=cnt;i++) { if(d[i]+v[now]<=m)//如果能裝就裝 { d[i]+=v[now]; dfs(now+1,cnt); d[i]-=v[now];//回溯,還原現場 } } d[cnt+1]=v[now]; dfs(now+1,cnt+1);//不能裝下,再租一輛 d[cnt+1]=0;//回溯,還原現場 } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&v[i]); sort(v+1,v+1+n);//從小到大排序 //較重的比較輕的更難運送,按遞減排序 reverse(v+1,v+1+n);//翻轉函數,把函數變成了從大到小排序 ans=n;//最多需要n輛 dfs(1,0); cout<<ans<<endl; return 0; }
CODEVS 4228 小貓爬山