思路
第一眼我以为是个背包,但由于是分组,所以有多个缆车,明显不能用背包。我做这题是因为老师要求,那是我们在学深搜减枝,所以我就开始写深搜。
这一题实际上是先选一直最重的猫,然后搞个 \(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;
}
标签:cnt,小猫,P10483,题解,sum,minans,int,dfs,id
From: https://www.cnblogs.com/zhouxi2022HZO/p/18617828