Input
Output
Sample Input
5 1996
1
2
1994
12
29
Sample Output
2
Hint
分析
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,W,w[20],f[1<<18],i,j,ans,Max;
void Min(int &a,int b){if(a>b)a=b;}
void Solve(){
scanf("%d%d",&n,&W);
int Max=1<<n;//最大状态
for(i=0;i<n;i++)
scanf("%d",&w[i]);
memset(f,0x3f,sizeof(f));
f[0]=0;
for(ans=1;;ans++){//枚举索道
for(i=0;i<Max;i++)
if(f[i]<=W)f[i]=0;//前ans-1个缆车能运走的状态清零
for(i=0;i<Max;i++)
if(f[i]<W)//表示i状态下还可以放,f[i]=0,则表示另开新缆车
for(j=0;j<n;j++)//枚举猫
if(!(i>>j&1))Min(f[i|(1<<j)],f[i]+w[j]);
if(f[Max-1]<=W){printf("%d\n",ans);break;}
}
}
int main(){
Solve();
return 0;
}
原文:https://www.cnblogs.com/hbhszxyb/p/13223714.html