經典動態規劃 USACO Mar09 奶牛飛盤隊
阿新 • • 發佈:2019-02-18
和是一個數F的倍數可以轉化為這個數Mod F為零。
記F[i][j]為前i個數的和餘數為j的方案數,顯然ANS=F[n][0]
對於每一個數,只有兩種狀態,取或者不取。
取:
F[i+1][(j+a[i])%f]=(F[i][j]+F[i+1][(j+a[i])%f])%M;
不取:
F[i+1][j]=(F[i+1][j]+F[i][j])%M;
初始化:
F[0][0]=1,所以最後結果要減去1。
#include<cstdio> #include<iostream> using namespace std; const int M=100000000; int dp[2005][1005]; int n,f; int main() { freopen("fristeam.in","r",stdin); freopen("fristeam.out","w",stdout); scanf("%d%d",&n,&f); dp[0][0]=1; for(int i=0;i<n;i++) { int x;scanf("%d",&x); for(int j=0;j<f;j++) { dp[i+1][j]=(dp[i+1][j]+dp[i][j])%M; dp[i+1][(j+x)%f]=(dp[i+1][(j+x)%f]+dp[i][j])%M; } } printf("%d\n",dp[n][0]-1); return 0; }