#include<iostream>
#include<algorithm>
using namespace std;
long long n,w,minn=1e9;
long long c[50],vis[50],sum[50];
bool cmp(int a,int b)
{
return a>b;
}
void dfs(int step,int num)
{
if(num>=minn)return;//剪枝
if(step==n+1)//递归边界
{
minn=num;
return;
}
sum[num+1]+=c[step];//第step号物品单独一组
dfs(step+1,num+1);
for(int i=1;i<=num;i++)
{
if(sum[i]+c[step]<=w)//寻找可以放下第step号物品的组
{
sum[i]+=c[step];
dfs(step+1,num);
sum[i]-=c[step];
}
}
}
int main(){
cin>>n>>w;
for(int i=1;i<=n;i++)
{
cin>>c[i];
}
sort(c+1,c+n+1,cmp);//贪心
dfs(1,0);
cout<<minn;
return 0;
}
怎么和p10483一样???