1 条题解

  • 6
    @ 2024-10-5 12:08:14

    这个题目的数据范围特别小,n50,ai1000n\le50,a_i\le 1000,那么最大只会出现 5000050000,够开一个映射数组了,那么我们只要用 01 背包看一看与 kk 最接近的能拼出来的数是多少即可。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    long long n,k,a[55],dp[50005],maxx=50000000,ans;
    int main(){
       //freopen("close.in","r",stdin);
       //freopen("close.out","w",stdout);
       cin>>n>>k;
       for(int i=1;i<=n;i++) cin>>a[i];
       sort(a+1,a+n+1);
       dp[0]=1;
       for(int i=1;i<=n;i++){
          for(int j=50000;j>=a[i];j--){
             if(dp[j-a[i]]=1) dp[j]=1;
          }
       }
       for(int i=1;i<=50000;i++){
          if(dp[i]==1&&abs(k-i)<=maxx){
             maxx=abs(k-i);
             ans=i;
          }
       }
       cout<<ans;
       return 0;
    }
    

    我给这份代码加了几个 bug,切忌 Ctrl+C/V

  • 1

信息

ID
784
时间
2000ms
内存
256MiB
难度
8
标签
(无)
递交数
51
已通过
7
上传者