真的没人看到,所以到这里问,求解答
  • 板块学术版
  • 楼主Zhang_Wenjie
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/8/11 09:53
  • 上次更新2023/10/27 16:00:35
查看原帖
真的没人看到,所以到这里问,求解答
481621
Zhang_Wenjie楼主2022/8/11 09:53

我觉得是我的整体认知不对,不仅仅是此题。
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];
    //sort(a+1,a+n+1);
    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的第二次循环minj=aik×ai\min\limits_{j=a_i}^{k\times a_i} 改为minj=aiK×Ai+1\min\limits_{j=a_i}^{K\times Ai+1} ,无需排序,也可以AC,为什么?

而且,对于当前面值aia_ifk×aif_{k\times a_{}i} 不就已经是能转移的状态上界了吗?我真搞不懂。

2022/8/11 09:53
加载中...