P2946 [USACO09MAR]Cow Frisbee Team S(01背包的倍数或余数相关的问题)

文章描述了一个USACO竞赛中的编程问题,约翰需要从N头奶牛中选择飞盘队伍,要求队伍总能力是F的倍数。解决方案涉及到动态规划,通过状态转移方程f[i][j]=(f[i-1][j]+f[i-1][(j-cow[i]+F)%F])%1e8,计算出所有可能的组合,并对10^8取模得出结果。

P2946 [USACO09MAR] Cow Frisbee Team S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的 N 头奶牛中选出一支队伍。

每只奶牛的能力为整数,第 i 头奶牛的能力为Ri​ 。飞盘队的队员数量不能少于 11、大于N。一支队伍的总能力就是所有队员能力的总和。

约翰比较迷信,他的幸运数字是 F ,所以他要求队伍的总能力必须是 F 的倍数。请帮他

算一下,符合这个要求的队伍组合有多少?由于这个数字很大,只要输出答案对 108108 取模的值。

输入格式

第一行:两个用空格分开的整数:N 和 F。

第二行到N+1 行:第i+1 行有一个整数Ri​ ,表示第 i 头奶牛的能力。

输出格式

第一行:单个整数,表示方案数对 108108 取模的值。

输入输出样例

输入 #1复制

4 5 
1 
2 
8 
2 

输出 #1复制

3 

说明/提示

数据范围与约定
  • 对于 100%100% 的数据,11≤N≤2000,1≤F≤1000 ,1≤Ri​≤105 。

题目

P10491 [USACO09NOV] The Chivalrous Cow B 是一个涉及在二维网格中按照特定规则(类似象棋中马的走法)寻找最短路径的问题。以下是一些类似的题目: #### 洛谷 P1135 奇怪的电梯 有一个奇怪的电梯,大楼的每一层楼都可以停电梯,而且第 $i$ 层楼($1 \leq i \leq N$)上有一个数字 $K_i$($0 \leq K_i \leq N$)。电梯只有两个按钮:上和下。从第 $i$ 层楼上楼时,若按下上的按钮,则会上升 $K_i$ 层;若按下下的按钮,则会下降 $K_i$ 层。当然,电梯不能上升到超过 $N$ 层,也不能下降到低于 $1$ 层。问从 $A$ 层到 $B$ 层至少要按多少次按钮。 #### 洛谷 P1331 海战 在一个矩形的海域上,分布着一些战舰,每艘战舰由若干个相邻(上下左右相邻)的格子组成。现在给出海域的地图,问这片海域上有多少艘战舰,并且判断这些战舰的分布是否符合规则(战舰不能相邻,即两艘战舰之间至少有一个空白格子)。 #### 洛谷 P1605 迷宫 给定一个 $N \times M$ 方格的迷宫,迷宫里有一些障碍格子不能通过,从起点 $(sx, sy)$ 出发,要到达终点 $(fx, fy)$,问有多少条不同的路径可以走。只能向上下左右四个方向移动。 以下是一个简单的广度优先搜索(BFS)示例代码,用于解决类似的最短路径问题: ```python from collections import deque # 定义方向数组,上下左右 dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] def bfs(grid, start, end): rows, cols = len(grid), len(grid[0]) visited = [[False] * cols for _ in range(rows)] queue = deque([(start[0], start[1], 0)]) # (x, y, steps) visited[start[0]][start[1]] = True while queue: x, y, steps = queue.popleft() if (x, y) == end: return steps for i in range(4): new_x = x + dx[i] new_y = y + dy[i] if 0 <= new_x < rows and 0 <= new_y < cols and not visited[new_x][new_y] and grid[new_x][new_y] != '#': visited[new_x][new_y] = True queue.append((new_x, new_y, steps + 1)) return -1 # 无法到达 # 示例使用 grid = [ ['.', '.', '.', '#'], ['.', '#', '.', '.'], ['.', '.', '.', '.'], ['.', '#', '#', '.'] ] start = (0, 0) end = (3, 3) result = bfs(grid, start, end) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值