题目大意:每头牛有一个能力值,在n头牛选若干头,求能力值和为F的倍数的方案数
题解:f[i][j]表示前i头牛能力值modF为j的方案数,只有两种决策
我的收获:状态中记录mod值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int M=2005;
const int P=1e8;
int n,F,a[M];
int f[M][M];
inline void add(int &x,int y){x+=y;if(x>P) x-=P;}
void work()
{
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=F;j++)
add(f[i][j],f[i-1][j]),add(f[i][(j+a[i])%F],f[i-1][j]);
cout<<f[n][0]-1<<endl;//扣掉f[0][0]的1
}
void init()
{
cin>>n>>F;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
}
int main()
{
init();
work();
return 0;
}
本文介绍了一种使用动态规划解决特定组合计数问题的方法,即从给定的一组整数中选择若干个数,使得这些数的能力值之和为某个固定值F的倍数。通过维护一个二维数组来记录中间状态,最终求得所有符合条件的组合数量。
506

被折叠的 条评论
为什么被折叠?



