【CH2201】小猫爬山
一道很基础的深搜题,数据范围不大,稍加剪枝即可通过。
将重量降序排列,对于已经选了的车,尝试当前的猫能不能坐,如果全部尝试失败,则另用一辆车。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 typedef long long ll; 5 inline int read() { 6 int ret=0,f=1; 7 char c=getchar(); 8 while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} 9 while(c<='9'&&c>='0') ret=ret*10+c-'0',c=getchar(); 10 return ret*f; 11 } 12 using namespace std; 13 int n,a[20],use[20],w; 14 int ans; 15 int cmp(int x,int y) { 16 return x>y; 17 } 18 void dfs(int now,int sum) { 19 if(sum>ans) return ; 20 if(now==n+1) { 21 ans=min(ans,sum); 22 return ; 23 } 24 for(int i=1;i<=sum;i++) 25 if(a[now]+use[i]<=w) { 26 use[i]+=a[now]; 27 dfs(now+1,sum); 28 use[i]-=a[now]; 29 } 30 use[sum+1]=a[now]; 31 dfs(now+1,sum+1); 32 use[sum+1]=0; 33 } 34 int main() { 35 n=read(); w=read(); 36 for(int i=1;i<=n;i++) a[i]=read(); 37 sort(a+1,a+n+1,cmp); 38 ans=n; 39 dfs(1,0); 40 printf("%d\n",ans); 41 return 0; 42 }