直接将猫的重量排序然后从大到小放猫,在放每只猫时,看一下之前的缆车还有没有空间,如果没有就开一个新的缆车放入
//能过部分样例,因为不一定是最优解
#include<iostream>
#include<algorithm>
using namespace std;
int a[20],num[20];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,w;
cin>>n>>w;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n,cmp);
int t=0,k=1;
for(int i=1;i<=n;i++)
{
bool flag=true;
for(int j=1;j<=k;j++)
{
if(num[j]+a[i]<=w)
{
num[j]+=a[i];
flag=false;
break;
}
}
if(flag)
{
num[++k]=a[i];
}
}
cout<<k;
return 0;
}
方法二:暴力出每一种情况
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 20;
int a[N],sum[N];//a数组记录每个猫的重量,sum记录每个缆车已经承载的质量
int ans = N;
int n,w;
bool cmp(int x,int y)
{
return x>y;
}
void dfs(int u,int k)//第几个猫,第几个缆车
{
if(u == n || k>=ans)
{
ans = min(k,ans);//剪枝
return ;
}
for(int i=0;i<k;i++)
{
if(sum[i] + a[u] <= w)
{
sum[i] += a[u];
dfs(u+1,k);
sum[i] -= a[u];//看看已经用了的缆车可以放下猫吗
}
}
sum[k] += a[u];
dfs(u+1,k+1);
sum[k] -= a[u];
}
int main()
{
cin>>n>>w;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n,cmp);
dfs(0,0);
cout<<ans<<endl;
return 0;
}