思路:n特别小,重量特别大,所以不能背包,只能搜索(注意n比较小的这个条件)
状态描述:u代表当前是哪一只cat,k代表第几辆缆车
转移:1.将当前这只cat放到前k个缆车上(枚举前k个缆车,判断是否能放入)
2.放到新的缆车上
#include<bits/stdc++.h>
using namespace std;
const int N=20,INF=0x3f3f3f3f;
int cat[N],sum[N];
int n,m;
int ans=INF;
void dfs(int u,int k){
if(k>=ans) return;
if(u==n){
ans=min(ans,k);
return;
}
for(int i=0;i<k;i++){
if(sum[i]+cat[u]<=m){
sum[i]+=cat[u];
dfs(u+1,k);
sum[i]-=cat[u];
}
}
sum[k]=cat[u];
dfs(u+1,k+1);
sum[k]=0;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>cat[i];
sort(cat,cat+n);
reverse(cat,cat+n);
dfs(0,0);
cout<<ans<<endl;
}
假如n比较大 重量比较小的话怎么背包呢
估计要一个一个背。依次选出性价比最高的包, 在剩下的再选出一个性价比最高的包 直到选完;