Cow Frisbee Team S(变相的01背包)
题目描述
老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的 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背包)相关推荐
- [DP]Cow Frisbee Team S
[DP]Cow Frisbee Team S 题面 题目描述 输入格式 输出格式 样例 数据范围 解析 代码 题面 题目描述 老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的 NN 头奶牛中选出 ...
- POJ2184 Cow Exhibition(DP:变种01背包)
题意: 一群奶牛分别有s和f两个值,要求选出一些奶牛使s与f的和最大并且s和f分别的和不能为负数. 要点: 用dp[i]=j表示当s的和为i时f的和为j,这样最后只要求dp[i]+i的最大值即可.注意 ...
- 牛客网暑期ACM多校训练营(第三场)A.PACM Team(多重01背包)
链接:https://www.nowcoder.com/acm/contest/141/A 来源:牛客网 题目描述 Eddy was a contestant participating in ACM ...
- 牛客网暑期ACM多校训练营(第三场)A - PAXM Team(01背包)
题目链接 思路 多重限制条件的01背包,输出选取那几小组,可以开个bool数组记录选取物品时的状态,然后从最后一个物品往上找标记. 后记 这道题比赛的时候数据太水,简单排序选一件物品就行,看别人代码还 ...
- HDU 3339 In Action 最短路+01背包
题目链接: 题目 In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU2602 (0-1背包)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU2602Bone Collector 简单0-1背包
HDU2602Bone Collector 简单0-1背包 Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 【 POJ - 3628 】Bookshelf 2(dfs 或 dp,0-1背包)
题干: Farmer John recently bought another bookshelf for the cow library, but the shelf is getting fill ...
- 【ZOJ - 3703】Happy Programming Contest(带优先级的01背包,贪心背包)
题干: In Zhejiang University Programming Contest, a team is called "couple team" if it consi ...
最新文章
- PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法,php/thinkphp实现微信分享自定义文字和图片...
- 二叉树的六种遍历方法汇总(转)
- boost::function_types::function_arity用法的测试程序
- java menu字体_Java开发网 - 请问如何让菜单字体变宋体?
- webclient post java_java – Spring WebFlux,如何调试我的WebClient POST交换?
- cad常青藤插件_CAD 2020软件安装包+插件大合集+完整视频教程,自学也可以的
- 使用了无效的sql语句_使用SQL语句创建数据库
- java 数据结构之堆排序
- 编程新手导论(转载)
- 大学生搜题软件哪个好?2020搜题软件排行榜
- Windows64位下DNW的安装及使用
- 为什么利率上升,债券价格下降?
- 解决电脑无法通过网线直连海康摄像机的问题
- STC12系列单片机的AUXR辅助寄存器
- 对于图片倾斜做矫正处理
- Flutter高仿微信-第59篇-同步数据
- 学习java随堂练习-20220623
- 爱死Intellij Idea 01
- java虚拟机线程调优与底层原理分析_啃碎并发(七):深入分析Synchronized原理...
- tslearn使用轮廓系数(silhouette_score)评估KShape聚类效果
热门文章
- 研讨:美国关闭DNS root服务器,对中国的互联网影响大吗?中国互联网会瘫痪吗?
- 顶级配置华硕笔记本电脑900元清仓咯
- Scrapy爬虫框架的解析与实例(中国大学MOOC)
- 《Java语言精粹》译者序
- 《游戏学习》经典打地鼠html小游戏whack-a-mole代码详解
- 微信小程序开源到github并更新的步骤
- 云安全为杀毒软件带来了什么
- java加密与解密工具_cat: CAT,全称Cryptographic Algorithm Tool,是一款小巧的Java加密与解密算法调用工具包...
- 定时器控制led跑马灯
- python mange.py runserver 报错:以一种访问权限不允许的方式做了一个访问套接字的尝试