dfs小猫爬山
https://ac.nowcoder.com/acm/contest/1014/A
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int cmp(int a,int b) { return a>b; } int a[20],car[20]={0}; int ans; int n,w; void dfs(int now,int cnt) { //剪枝 if(cnt>=ans) return; if(now>n) { ans=min(ans,cnt); return; } for(int i=1;i<=cnt;i++) { if(car[i]+a[now]<=w)//装得下 { car[i]+=a[now]; dfs(now+1,cnt); car[i]-=a[now];//回溯 } } car[cnt+1]=a[now];//新开个箱子 dfs(now+1,cnt+1); car[cnt+1]=0; } int main() { scanf("%d %d",&n,&w); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1,cmp); ans=n; dfs(1,0); printf("%d\n",ans); }
浙公网安备 33010602011771号