rt,本题正解为折半搜索,然而本蒟蒻爆搜+剪枝代码甚至碾压大部分标算(合计130ms),并且秒过讨论区某hack。
#include<bits/stdc++.h>
using namespace std;
long long w[105],num[105];
int minn=114514,n,m;
inline bool cmp(int x,int y){
return x>y;
}
inline void dfs(int x,long long ans,int cnt){
if(x==n+1){
if(ans!=m){
return;
}
minn=min(minn,cnt);
return;
}
if(ans+num[x]<m){//前缀和优化剪枝+可行性剪枝
return;
}
if(ans+num[x]==m){//前缀和优化剪枝
minn=min(minn,cnt);
return;
}
if(ans+w[x]<=m){//可行性剪枝
dfs(x+1,ans+w[x],cnt);
}
if(ans+w[x]/2<=m){
dfs(x+1,ans+w[x]/2,cnt+1);
}
dfs(x+1,ans,cnt);
}
int main()
{
scanf("%d %d",&n,&m);
m*=2;
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
w[i]*=2;
}
sort(w+1,w+n+1,cmp);//排序(贪心)
for(int i=n;i>=1;i--){
num[i]=num[i+1]+w[i];
}
dfs(1,0,0);
if(minn!=114514){
printf("%d",minn);
}
else{
printf("-1");
}
}
因此,请求加强数据。