题解:P14508 猜数游戏 guess
这个题有点难啊。
考虑分治,如果希望得出
那么就可以设
转移有
假设
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fr first
#define sc second
#define pii pair<int,int>
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define ro(i,r,l) for(int i=r;i>=l;i--)
const int N=2e4+5,V=1e4;
int T,n,m,a[N],b[N],f[N],g[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>T>>T;
while (T--){
cin>>n>>m;
fo(i,1,m)
cin>>a[i];
fo(i,0,V*2)
g[i]=1e18;
g[V]=0;
fo(i,1,m){
cin>>b[i];
fo(j,a[i],V*2)
g[j]=min(g[j],g[j-a[i]]+b[i]);
ro(j,V*2-a[i],0)
g[j]=min(g[j],g[j+a[i]]+b[i]);
}
fo(i,2,n){
f[i]=1e18;
fo(j,1,min(i-1,V))
f[i]=min(f[i],max(f[j],f[i-j])+g[j+V]);
}
if (f[n]==1e18)
cout<<"-1\n";
else cout<<f[n]<<'\n';
}
return 0;
}