2 条题解

  • 0
    @ 2025-10-8 16:59:13
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e4+10, K=2e2+10;
    long long f[N][K], a[N];
    int main()
    {
        //freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);
        int n, k;scanf("%d%d", &n, &k);
        for(int i=1;i<=n;++i)scanf("%lld", &a[i]);
        memset(f, -63, sizeof(f));
        for(int i=0;i<=n;i++)f[i][0]=0;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=k-1;j++)
            {
                f[i][(j+a[i])%k] = max(f[i][(j+a[i])%k], f[i-1][(j+a[i])%k]);
                f[i][(j+a[i])%k] = max(f[i][(j+a[i])%k], f[i-1][j] + a[i]);
            }
        printf("%lld\n", f[n][0]);
        return 0;
    }
    

    奇怪省空间小作伐by hansang:

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e4+10, M=210;
    typedef long long LL;
    const LL P=1e8;
    LL a[N], f[2][M];
    int main(){
        int n, m; scanf("%d%d", &n, &m);
        for(int i=1; i<=n; i++) scanf("%lld", &a[i]);
        memset(f, -0x3f, sizeof(f)); int t=0;
        f[1][0]=0; LL inf=f[0][0];
        for(int i=1; i<=n; i++){
            for(int j=0; j<m; j++){
                int d=(j-a[i]%m+m)%m;
                f[t][j]=max({f[t^1][j], f[t^1][d]+(d+a[i])/m});
            }
            f[t][a[i]%m]=max(f[t][a[i]%m], a[i]/m);
            t^=1;
        }
        printf("%lld\n", f[t^1][0]*m);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:59:01
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4+10,K=2e2+10;
      long long f[N][K],a[N];
      int main()
      {
          //freopen("a.in","r",stdin);freopen("a.out","w",stdout);
          int n,k;scanf("%d%d",&n,&k);
      	for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
      	memset(f,-63,sizeof(f));
      	for(int i=0;i<=n;i++)f[i][0]=0;
      	for(int i=1;i<=n;i++)
      		for(int j=0;j<=k-1;j++)
      		{
      			f[i][(j+a[i])%k]=max(f[i][(j+a[i])%k],f[i-1][(j+a[i])%k]);
      			f[i][(j+a[i])%k]=max(f[i][(j+a[i])%k],f[i-1][j]+a[i]);
      		}
          printf("%lld\n",f[n][0]);
          return 0;
      }



      奇怪省空间小作伐by hansang:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4+10, M=210;
      typedef long long LL;
      const LL P=1e8;
      LL a[N], f[2][M];
      int main(){
      	int n, m; scanf("%d%d", &n, &m);
      	for(int i=1; i<=n; i++) scanf("%lld", &a[i]);
      	memset(f, -0x3f, sizeof(f)); int t=0;
      	f[1][0]=0; LL inf=f[0][0];
      	for(int i=1; i<=n; i++){
      		for(int j=0; j<m; j++){
      			int d=(j-a[i]%m+m)%m;
      			f[t][j]=max({f[t^1][j], f[t^1][d]+(d+a[i])/m});
      		}
      		f[t][a[i]%m]=max(f[t][a[i]%m], a[i]/m);
      		t^=1;
      	}
      	printf("%lld\n", f[t^1][0]*m);
      	return 0;
      } 
      • 1

      *【背包练习】用余数定义状态

      信息

      ID
      1896
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      165
      已通过
      28
      上传者