众所周知,这道题是个背包dp练手题。
但是!我不会dp,用了集合枚举,经过了亿点优化,居然A了?!(虽然O2,加了O2最后一个点也992ms蹭边过的)
以下是代码:
#include <iostream>
using namespace std;
int v,n,a[31],minn=2147483647,acc;
inline int read(){
register int x=0;
register char ch=getchar();
while(ch<'0'||ch>'9'){
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x;
}
int main(void){
v=read();
n=read();
for(register int i=0;i<n;++i){
a[i]=read();
}
register int bin=(int)(v*0.8);//筛掉一部分过小数据
register int S=1<<n;
for(register int U=S-1;U>=0;--U){
acc=0;
for(register int i=0;i<n;++i){
if(U&(1<<i)){
acc+=a[i];
if(acc>v){
acc=0;
break;
}
}
}
minn=min(v-acc,minn);
if(acc<bin&&acc!=0){
break;
}
if(minn==0){
break;
}
}
printf("%d",minn);
}
所以说,请求加一些更强的数据,或者加上枚举,暴力的标签~~(加标签我觉得不可能)~~