我觉得是我的整体认知不对,不仅仅是此题。
P2725
对于此题,我的代码为什么不加对a数组的排序就只有62分,排了就AC了?
#include<bits/stdc++.h>
using namespace std;
const int K=200,N=50,Ai=10000;
int k,n,a[N+1],f[K*Ai+1],ans;
int main()
{
cin>>k>>n;
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=a[i];j<=k*a[i];j++) f[j]=min(f[j],f[j-a[i]]+1);
for(int i=1;i<=K*Ai+1;i++)
if(f[i]!=1e6 && f[i]<=k) ans++;
else break;
cout<<ans;
return 0;
}
我之后还发现,如果我将DP的第二次循环j=aimink×ai
改为j=aiminK×Ai+1
,无需排序,也可以AC,为什么?
而且,对于当前面值ai
,fk×ai
不就已经是能转移的状态上界了吗?我真搞不懂。