用dfs即可
注意剪枝优化
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 20;
int w[N];//记录每只小猫的重量
int n,m;
LL sum[N];//记录每辆车的重量
int res = N;//最坏的情况就是每只小猫用一辆车
void dfs(int u,int cnt)//当前已经装了u只小猫,用了cnt辆车
{
if(cnt >= res) return;//如果cnt >= 最坏情况,就退出
if(u == n)//如果已经考虑完了n只小猫
{
res = cnt;
return;
}
//对于每只小猫而言,都有两种选择
//一种是放在前面cnt - 1辆车里面,还有一种是另用一辆车
for(int i = 0;i < cnt;i++)
{
if(sum[i] + w[u] <= m)//如果这辆车的重量加上小猫的重量小于最大承受重量
{
sum[i] += w[u];
dfs(u + 1,cnt);
sum[i] -= w[u];//恢复现场
}
}
sum[cnt] = w[u];//另外用一辆车
dfs(u + 1,cnt + 1);
sum[cnt] = 0;//恢复现场
}
int main()
{
cin >> n >> m;
for(int i = 0;i < n;i++) cin >> w[i];
dfs(0,0);//从第0只小猫开始,此时用了0辆车
cout << res << endl;
return 0;
}