一般像这种求解最小值的最优化搜索问题,有两种方式来解决。
1. 维护一个全局变量res
作为最小值,不断用求解出的可行解更新这个最小值,并加上最优性剪枝
2. 迭代加深解法,第一次迭代加深返回true时,得到的深度depth就是最优解
鉴于这道题目比较简单,两种方式实现都比较容易,在这里写一下迭代加深的写法,扩展一下思路
代码如下:
//迭代加深解法
#include<bits/stdc++.h>
using namespace std;
const int N=18;
int n,w;
int a[N];
int sum[N];
int len=0;//len代表当前用的车的数量
bool dfs(int u,int depth){
if(u==n) return true;//depth辆车能把全部的猫都装完,返回true;
for(int i=0;i<len;i++){//看看现在的车上能否装下a[u]这只猫
if(sum[i]+a[u]<=w){
sum[i]+=a[u];
if(dfs(u+1,depth)) return true;//能装a[u]则考虑下一只猫a[u+1]
sum[i]-=a[u];
}
}
//不能装则判断车是否已经用完
if(len==depth) return false;//当前车用完了但猫还没装完
//车还没用完,开一辆新车来装当前这只猫
sum[len++]+=a[u];
if(dfs(u+1,depth)) return true;
sum[--len]-=a[u];
//之前没能成功返回证明车数量不够,返回false
return false;
}
int main(){
cin>>n>>w;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
reverse(a,a+n);
//depth就是允许的车的最大数量
int depth=0;
while(!dfs(0,depth)) depth++;
cout<<depth<<endl;
}