1 条题解

  • 0
    @ 2025-10-10 19:30:57

    C++ :

    #include<stdio.h>
    #include<cstring>
    using namespace std;
    const int maxn=256*256;
    const int maxx=256*256+256;
    bool f[maxx+1],flag; 
    int nn,i,j,n,c,a[11],now,k;
    int main()
    {
    
      scanf("%ld",&nn);n=0;
      for (i=1;i<=nn;i++) 
      {
        scanf("%ld",&c);
        if (c==1) 
        {
          printf("0\n");
          return 0;
        }
        flag=true;
        for (j=1;j<=n;j++)
          if (c%a[j]==0) {flag=false;break;}
        if (flag) a[++n]=c;
      }
      memset(f,0,sizeof(f));
      f[0]=true;
      for (i=1;i<=n;i++)
        for (j=a[i];j<=maxx;j++)
          if (f[j-a[i]]) f[j]=true;
      for (i=maxx;i>maxn;i--) if (!f[i]) {printf("0\n");return 0;}
      for (i=maxn;i>0;i--)
        if (!f[i])
        {
          printf("%ld\n",i);
          return 0;
        }
      printf("0\n");
      return 0;
      }
    

    Pascal :

    program nuggets;
    var
     f:array[0..666666]of boolean; 
     a:array[0..10]of longint;
     i,j,m,max,n:longint;
    begin
     readln(n);
     for i:=1 to n do
      begin
       readln(a[i]);
       if a[i]>max then max:=a[i];
      end;
     f[0]:=true;
     for i:=0 to sqr(max)+max do  //数学可证明到最大到这个范围就都可以包装;
      if f[i] then   // 这个位置可以得到
       for j:=1 to n do //把之后能达到的都赋值成true;      
        f[i+a[j]]:=true
       else
        if i>m then m:=i;
     if m>sqr(max) then writeln(0)  
                   else writeln(m);
    end.
    
    • 1

    信息

    ID
    838
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者