1. 程式人生 > 其它 >P2946 [USACO09MAR]Cow Frisbee Team S 題解

P2946 [USACO09MAR]Cow Frisbee Team S 題解

技術標籤:演算法c++動態規劃java資料結構

[USACO09MAR]Cow Frisbee Team S

description:

求和為

F 的倍數的揹包問題方案總數。

solution:

f_{i,j} 表示計算到了第 i 頭牛,總能力之和 \bmod mj 的方案總數。

f_{i,j}=(f_{i,j}+f_{i-1,j}+f_{i-1,(j-a[i]+m)\bmod m})\bmod 10^8

其中

+m 是為了防止陣列變為負數下標。

然後最開始可以對於所有的

a_i\bmod m

初始化為

f_{i,a_i}=1 ,即單獨選擇每一頭牛的各一種方案。

code:

#include<cstdio>
using namespace std;
int mod=100000000;
int f[2005][1005
],a[2005];//f(i,j)表示前i頭牛,總能力之和%m的餘數為j時的方案數。 int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); a[i]%=m; } for(int i=1;i<=n;i++) { f[i][a[i]]=1; } for(int i=1;i<=n;i++) { for(int j=0;j<m;j++) { f[i][j]=
(f[i][j]+f[i-1][j]+f[i-1][(j-a[i]+m)%m])%mod; } } printf("%d\n",f[n][0]); return 0; }