//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; }
原文地址:https://www.cnblogs.com/Dxy0310/p/9534219.html
时间: 2024-10-06 19:34:01