[USACO09MAR]牛飞盘队Cow Frisbee Team

传送门:https://www.luogu.org/problem/P2946

本题类似于01背包,定义  dp[i][j]  表示前  i  个牛,总和取模幸运值为  j  时的数量,a[i]为第j头牛的能力值,很明显dp[i][j]+=dp[i-1][j](不选择第i头牛)+dp[i-1][(j-a[i]+幸运值)%幸运值](选择第i头牛),这样就可以推出dp[n][0]第n头牛时余数为 0  的数量

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,luck;
 4 const int mod=(int)1e8;
 5 int a[2009];
 6 int dp[2009][1009];
 7 inline int read()
 8 {
 9     int x=0,f=1;char ch=getchar();
10     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
11     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
12     return x*f;
13 }
14 int main()
15 {
16     n=read(),luck=read();
17     for(int i=1;i<=n;i++)
18     {
19         a[i]=read();
20         a[i]%=luck;
21         dp[i][a[i]%luck]=1;
22     }
23     for(int i=1;i<=n;i++)
24     {
25         for(int j=0;j<luck;j++)
26         {
27             dp[i][j]=(dp[i-1][j]%mod+dp[i][j]%mod+dp[i-1][(j-a[i]+luck)%luck]%mod)%mod;
28         }
29     }
30     cout<<dp[n][0];
31 }

猜你喜欢

转载自www.cnblogs.com/1129-tangqiyuan/p/11600234.html
今日推荐