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

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

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

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

输入格式
第一行:两个用空格分开的整数:N和 F。
第二行到 N+1 行:第i+1 行有一个整数R_i,表示第 i头奶牛的能力。

输出格式
加粗样式第一行:单个整数,表示方案数对 108 取模的值。

输入输出样例
输入
4 5
1
2
8
2
输出
3
说明/提示
数据范围与约定
对于 100%100% 的数据,1≤N≤2000,1≤F≤1000 ,1≤R_i≤105

在看完题目之后,其实就是01背包的思想,每头牛只有两个状态,取或者是不取,但它又跟01背包不太一样,经典的01背包是取价值的最大值,但是这个题目时取模上F为0的值,这就难到了不少刚接触01背包的小伙伴,其实这道题虽然有01背包的思想,其实是一道DP动态规划的题目。

经典的01背包问题是只用一维DP即可解决问题,但是该题目有了一个新的要求,值模上幸运数字F为几。

那么就可以用二维DP,第一维表示考虑前多少头奶牛,第二维DP用来表示所选的奶牛的权值和模上F之后为几
这点如果能想到,那就变得非常简单了,最后结果只需要输出遍历完所有奶牛之后模为0的DP即可,即dp[n][0]

#include <iostream>using namespace std;
#define mod 100000000
int dp[2055][2055],r[2055];
int main()
{int n,f;cin>>n>>f;for(int i=1;i<=n;i++){cin>>r[i];r[i]%=f;//输入时就进行模F的操作,便于后续计算,减小数值}for(int i=1;i<=n;i++)dp[i][r[i]]=1;//初始化dp,只考虑第i头牛for(int i=1;i<=n;i++){for(int j=0;j<=f-1;j++){dp[i][j]=((dp[i][j]+dp[i-1][j])%mod+dp[i-1][(j-r[i]+f)%f]%mod)%mod;//算出所有模上f为j的情况共有三个值//1.dp[i][j]本身,表示只取第i头牛//2.dp[i-1][j],表示不选第i头奶牛,前i-1头奶牛中模f为j的情况数//3.dp[i-1][(j-r[i]+f)%f]表示选第i头牛,第i头牛的值为r[i],再加上考虑到前i-1头牛时,值为j-r[i]的情况//但是j-r[i]可能小于0,所以需要加上f再模上f}}cout<<dp[n][0];return 0;
}

取或不取,思想跟01背包的思想一样,但是需要对01背包进行变形,变成了DP,我感觉01背包的思想服务于DP动态规划,该题因该算一道经典DP题目 。背包属于DP

Cow Frisbee Team S(变相的01背包)相关推荐

  1. [DP]Cow Frisbee Team S

    [DP]Cow Frisbee Team S 题面 题目描述 输入格式 输出格式 样例 数据范围 解析 代码 题面 题目描述 老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的 NN 头奶牛中选出 ...

  2. POJ2184 Cow Exhibition(DP:变种01背包)

    题意: 一群奶牛分别有s和f两个值,要求选出一些奶牛使s与f的和最大并且s和f分别的和不能为负数. 要点: 用dp[i]=j表示当s的和为i时f的和为j,这样最后只要求dp[i]+i的最大值即可.注意 ...

  3. 牛客网暑期ACM多校训练营(第三场)A.PACM Team(多重01背包)

    链接:https://www.nowcoder.com/acm/contest/141/A 来源:牛客网 题目描述 Eddy was a contestant participating in ACM ...

  4. 牛客网暑期ACM多校训练营(第三场)A - PAXM Team(01背包)

    题目链接 思路 多重限制条件的01背包,输出选取那几小组,可以开个bool数组记录选取物品时的状态,然后从最后一个物品往上找标记. 后记 这道题比赛的时候数据太水,简单排序选一件物品就行,看别人代码还 ...

  5. HDU 3339 In Action 最短路+01背包

    题目链接: 题目 In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  6. HDU2602 (0-1背包)

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. HDU2602Bone Collector 简单0-1背包

    HDU2602Bone Collector 简单0-1背包 Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  8. 【 POJ - 3628 】Bookshelf 2(dfs 或 dp,0-1背包)

    题干: Farmer John recently bought another bookshelf for the cow library, but the shelf is getting fill ...

  9. 【ZOJ - 3703】Happy Programming Contest(带优先级的01背包,贪心背包)

    题干: In Zhejiang University Programming Contest, a team is called "couple team" if it consi ...

最新文章

  1. PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法,php/thinkphp实现微信分享自定义文字和图片...
  2. 二叉树的六种遍历方法汇总(转)
  3. boost::function_types::function_arity用法的测试程序
  4. java menu字体_Java开发网 - 请问如何让菜单字体变宋体?
  5. webclient post java_java – Spring WebFlux,如何调试我的WebClient POST交换?
  6. cad常青藤插件_CAD 2020软件安装包+插件大合集+完整视频教程,自学也可以的
  7. 使用了无效的sql语句_使用SQL语句创建数据库
  8. java 数据结构之堆排序
  9. 编程新手导论(转载)
  10. 大学生搜题软件哪个好?2020搜题软件排行榜
  11. Windows64位下DNW的安装及使用
  12. 为什么利率上升,债券价格下降?
  13. 解决电脑无法通过网线直连海康摄像机的问题
  14. STC12系列单片机的AUXR辅助寄存器
  15. 对于图片倾斜做矫正处理
  16. Flutter高仿微信-第59篇-同步数据
  17. 学习java随堂练习-20220623
  18. 爱死Intellij Idea 01
  19. java虚拟机线程调优与底层原理分析_啃碎并发(七):深入分析Synchronized原理...
  20. tslearn使用轮廓系数(silhouette_score)评估KShape聚类效果

热门文章

  1. 研讨:美国关闭DNS root服务器,对中国的互联网影响大吗?中国互联网会瘫痪吗?
  2. 顶级配置华硕笔记本电脑900元清仓咯
  3. Scrapy爬虫框架的解析与实例(中国大学MOOC)
  4. 《Java语言精粹》译者序
  5. 《游戏学习》经典打地鼠html小游戏whack-a-mole代码详解
  6. 微信小程序开源到github并更新的步骤
  7. 云安全为杀毒软件带来了什么
  8. java加密与解密工具_cat: CAT,全称Cryptographic Algorithm Tool,是一款小巧的Java加密与解密算法调用工具包...
  9. 定时器控制led跑马灯
  10. python mange.py runserver 报错:以一种访问权限不允许的方式做了一个访问套接字的尝试