1. 程式人生 > >CODEVS 4228 小貓爬山

CODEVS 4228 小貓爬山

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];
void 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; }
View Code

CODEVS 4228 小貓爬山