思路
第一眼我以为是个背包,但由于是分组,所以有多个缆车,明显不能用背包。我做这题是因为老师要求,那是我们在学深搜减枝,所以我就开始写深搜。
这一题实际上是先选一直最重的猫,然后搞个 \(sum\) 数组,每搞一个新缆车的就下一个下标继续放,如果能放就放,当然也要搞一个能放但不放的。减枝就是如果当前所需缆车数量大于 \(minans\) 了,就返回。
具体代码很好写。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=101;
int n,w;
int v[N];
int sum[20];
int minans=INT_MAX;
void dfs(int id,int cnt){if(cnt>minans) return ;if(id>n){minans=min(minans,cnt);return ;}for(int i=1;i<=cnt;i++){if(w-sum[i]>=v[id]){sum[i]+=v[id];dfs(id+1,cnt);sum[i]-=v[id];}}sum[cnt+1]+=v[id];dfs(id+1,cnt+1);sum[cnt+1]-=v[id];
}
int main(){cin>>n>>w;for(int i=1;i<=n;i++) cin>>v[i];sort(v+1,v+n+1,greater<int>());dfs(1,0);cout<<minans;return 0;
}