#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20;
int n,w,a[N],ans=0x3f3f3f3f,minn=0x3f3f3f3f,cub[N];
bool cmp(int x,int y){
return x>y;
}
void dfs(int x,int p){
if(p>=ans)return;
if(x==n+1){
ans=p;
return;
}
for(int i=1;i<=p;i++){
if(cub[i]+a[x]<=w){
cub[i]+=a[x];
dfs(x+1,p);
cub[i]-=a[x];
}
}
dfs(x,p+1);//改动
}
signed main(){
cin>>n>>w;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1,cmp);
dfs(1,0);
cout<<ans;
return 0;
}
这样就会 T on #2。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20;
int n,w,a[N],ans=0x3f3f3f3f,minn=0x3f3f3f3f,cub[N];
bool cmp(int x,int y){
return x>y;
}
void dfs(int x,int p){
if(p>=ans)return;
if(x==n+1){
ans=p;
return;
}
for(int i=1;i<=p;i++){
if(cub[i]+a[x]<=w){
cub[i]+=a[x];
dfs(x+1,p);
cub[i]-=a[x];
}
}
cub[p+1]=a[x];
dfs(x+1,p+1);//这里改动
cub[p+1]=0;
}
signed main(){
cin>>n>>w;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1,cmp);
dfs(1,0);
cout<<ans;
return 0;
}
这样就 AC 了。
看起来它貌似只优化了一层循环,而 n 又那么小,为什么会给我 T。