2 条题解

  • 0
    @ 2025-10-8 17:00:41

    解法一:普通动态规划(二维数组)

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e3+10,K=1e3+10,mod=1e8;
    int 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("%d",&a[i]);
    	memset(f,0,sizeof(f));
    	f[0][0]=1;
    	for(int i=1;i<=n;i++)
    		for(int j=0;j<=k-1;j++)
    		{
    			f[i][j]=(  f[i-1][j]   +  f[i-1][((j-a[i])%k+k)%k]   )  % mod;
    		}
        printf("%d\n",(f[n][0]-1+mod)% mod);
        return 0;
    }
    

    解法二:滚动数组优化

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e3+10,K=1e3+10,mod=1e8;
    int f[2][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("%d",&a[i]);
    	memset(f,0,sizeof(f));
    	f[0][0]=1;
        int  t=0;
    	for(int i=1;i<=n;i++)
        {
            t=t^1;
            memset(f[t],0,sizeof(f[t]));
    
    		for(int j=0;j<=k-1;j++)
    		{
    			f[t][j]=(  f[t^1][j]   +  f[t^1][((j-a[i])%k+k)%k]   )  % mod;
    		}
        }
        printf("%d\n",(f[t][0]-1+mod)% mod);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:00:33

      原始代码:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e3+10,K=1e3+10,mod=1e8;
      int 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("%d",&a[i]);
      	memset(f,0,sizeof(f));
      	f[0][0]=1;
      	for(int i=1;i<=n;i++)
      		for(int j=0;j<=k-1;j++)
      		{
      			f[i][j]=(  f[i-1][j]   +  f[i-1][((j-a[i])%k+k)%k]   )  % mod;
      		}
          printf("%d\n",(f[n][0]-1+mod)% mod);
          return 0;
      }
      

      滚动数组代码:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e3+10,K=1e3+10,mod=1e8;
      int f[2][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("%d",&a[i]);
      	memset(f,0,sizeof(f));
      	f[0][0]=1;
          int  t=0;
      	for(int i=1;i<=n;i++)
          {
              t=t^1;
              memset(f[t],0,sizeof(f[t]));
      
      		for(int j=0;j<=k-1;j++)
      		{
      			f[t][j]=(  f[t^1][j]   +  f[t^1][((j-a[i])%k+k)%k]   )  % mod;
      		}
          }
          printf("%d\n",(f[t][0]-1+mod)% mod);
          return 0;
      }


      • 1

      *【背包练习】和为K倍数的方案数[USACO09MAR] Cow Frisbee Team S

      信息

      ID
      2295
      时间
      1000ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      124
      已通过
      26
      上传者