[USACO09MAR]牛飞盘队Cow Frisbee Team

题目 ::

农夫顿因开始玩飞盘之后,约翰也打算让奶牛们享受飞盘的乐趣.他要组建一只奶牛飞盘

队.他的N(1≤N≤2000)只奶牛,每只部有一个飞盘水准指数Ri(1≤Ri≤100000).约翰要选出1只或多于1只奶牛来参加他的飞盘队.由于约翰的幸运数字是F(1≤F≤1000),他希望所有奶牛的飞盘水准指数之和是幸运数字的倍数.

帮约翰算算一共有多少种组队方式.

输入格式

* Line 1: Two space-separated integers: N and F

* Lines 2..N+1: Line i+1 contains a single integer: R_i

输出格式

* Line 1: A single integer representing the number of teams FJ can choose, modulo 100,000,000.

输入输出样例

输入 #1复制
4 5 
1 
2 
8 
2 
输出 #1复制
3 

思路:::
比较像01背包;我们可以定义一个二维dp[i][j];表示前i头牛所选和为j(mod F)组合数;然后就是建立转移方程,对于每一头牛我们有两种操作
1):不选择该头牛,那么dp[i][j]=dp[i-1][j];
2): 选择该头牛,那我们就应该从前i-1头牛中找到所选和为(j-ma[i])的组合数
综上 转移方程::dp[i]j]+=dp[i-1[j]+dp[i-1][(j-ma[i])]
但需要注意一下(j-ma[i])可能为负的,(j-ma[i]+F)%F就可以变成正数了;
可别忘了初始化:
dp[i][ma[i]]=1;
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=1e8+5;
 5 const ll MOD=100000000;
 6 int ma[2005];
 7 int dp[2005][1005];
 8 int main()
 9 {
10     int n,F;
11     scanf("%d%d",&n,&F);
12     for(int i=1;i<=n;i++){
13         scanf("%d",&ma[i]);
14         ma[i]%=F;
15     }
16     for(int i=1;i<=n;i++)
17 
18     {
19         dp[i][ma[i]]=1;
20     }
21     for(int i=1;i<=n;i++)
22     {
23         for(int j=0;j<F;j++)
24         {
25             dp[i][j]=(dp[i][j]+dp[i-1][j]+dp[i-1][(j-ma[i]+F)%F])%MOD;;
26         }
27     }
28     printf("%d\n",dp[n][0]);
29     return 0;
30 }

 

但对于小数据 可以这样求(运行慢):(对于这题超内存,哈哈哈

题意就是求 各种组合数(1个,2个。。。。n个)

 1     int ant=0;
 2     deq[ant++]=0;
 3     for(int i=1;i<=n;i++)
 4     {
 5         int k=ant;
 6         for(int j=0;j<k;j++)
 7         {
 8             deq[ant++]=(deq[j]+a[i]);
 9         }
10     }
自己模拟一下你就明白了

 

转载于:https://www.cnblogs.com/sj-gank/p/11492737.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 奶牛飞盘 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: Farmer John 想从他的N只奶牛(1<=N<=2000)选出若干组成一支飞盘,N只奶牛依次编号为1..N,每只奶牛根据其飞盘的技能排名为R_i,(1<=R_i<=100,000)。由于Farmer John的幸运数字是F(1<=F<=1000), 因此,他想让他的伍中奶牛的排名之和是F的倍数。现在Farmer John知道,他有多少种选择的方式。由于这个数十分大,因此只用输出这个数 模( mod )100,000,000.。 输入: 第一行两个数字N和F。 接下来的N行每行有一个数字代表第R_i. 输出: 只有一行,输出FJ 组方案数 mod 100,000,000的值(对100,000,000取余数 )。 输入样例: 4 5 1 2 8 2 输出样例: 3 提示: 注:样例中Farmer John 有4只奶牛,排名依次为 1, 2, 8, and 2. ,然而FJ只会选排名之和为5的倍数的伍。 来源: USACO月赛 2. 判素数 时限:100ms 内存限制:10000K 总时限:1000ms 描述: 给出一个数N(2<=N<=10000),判定它是否为素数。 素数:一个大于等于2的数,除了1和它本身,再没有其他的整数能将其整除的数叫素数。 输入: 从标准输入输入一个整数。 输出: 若给定数为素数,向标准输出输出“Yes”,否则,输出“No”。 输入样例: 997 输出样例: Yes 提示: 从2开始,到N-1,对N进行试除,若存在某个数能将N整除,说明N为非素数。若不存在任何的整数能将其整除,说明N试素数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值