Dota英雄卡尔有多少个技能?
来源:互联网 发布:lol网络不稳 编辑:程序博客网 时间:2024/05/17 02:43
在百度贴吧Dota吧看到一道算法题,假设卡尔能召唤k种元素,并且身上同时能挂m个元素,则卡尔最多能搓出多少个技能?
题目特意指出,卡尔搓出什么技能仅取决于身上挂着的各种元素数目的比值,而与元素的排列顺序无关。
解这个题花了我一天的时间,惭愧,因为我是基于我昨天的思路开展的,而昨天的思路是错的。重新对题目进行形式化描述后,问题很快解决。
不过两种思路的基础是一样的,都是对题目进行正确的建模——针对每种元素进行讨论,而不是针对每个槽位——然后将建好的模型映射到递归模型上
#include <stdio.h>#include <stdlib.h>unsigned int skill(unsigned int elem_num, unsigned int slot_num){ int skill_num = 0; int elem_i_slot_num = 0; if (elem_num == 0){ return 0; //如果卡尔连一种元素都召唤不来,自然搓不出任何技能 }else if (elem_num == 1){ return 1; //当只能召唤一种元素时,卡尔身上就算同时能挂m个元素,也只能搓出一种技能 } if (slot_num == 0){ return 1; //当代码运行到此处时,说明卡尔还能召唤1种以上的技能,但此时他身上已经挂满了元素,所以能搓出的技能已经是固定的一种 }else if (slot_num == 1){ return elem_num; //当卡尔身上只能挂一个元素时,就算能召唤k种元素,也只能搓出k种技能 } //分情况讨论: //如果已知第i种元素占0个槽位,则卡尔能搓出技能f(k,m)等于f(k-1, m); //如果已知第i种元素占1个槽位,则卡尔能搓出的技能f(k,m)等于f(k-1, m-1), //以此类推,将第i种元素的所有可能槽位占据情况累加起来,就得到了卡尔所有能搓出的技能, //又因为技能跟元素排列顺序无关,所以总技能数就是 //f(k,m) = f(k-1, m) + f(k-1, m-1) + ... + f(k-1, 0) for (elem_i_slot_num = 0; elem_i_slot_num <= slot_num; elem_i_slot_num++){ skill_num += skill(elem_num - 1, slot_num - elem_i_slot_num); } return skill_num;}int main(){ unsigned int k, m; printf("input elem num and slot num, seperated by a blank space\n"); scanf("%u %u", &k, &m); printf("%u\n", skill(k, m)); return 0;}
0 0
- Dota英雄卡尔有多少个技能?
- 卡尔一键放技能--dota
- DOTA 104个英雄416个技能、104首情诗
- dota英雄技能快捷键大全
- 用java开发dota英雄最华丽的技能
- dota英雄全称
- dota 技能表
- 有多少个PAT
- Dota英雄装备配置(转)
- DOTA~杀人声音,英雄台词
- DOTA英雄 精美图片 大集合
- DOTA中所有被动技能
- 实现Dota技能冷却效果
- 中国字一共有多少个?
- 查找有多少个串口
- 全世界有多少个国家
- 汉字总共有多少个
- 判断有多少个闰年
- 数据结构之对任意长的字符串反向输出
- 163邮箱利用phpmailer发送邮件
- 24. Swap Nodes in Pairs
- java基础巩固----Junit单元测试
- Codeforces Round #325 (Div. 2)-D. Phillip and Trains
- Dota英雄卡尔有多少个技能?
- 用显式欧拉格式和改进的欧拉格式求解常微分初值问题
- 看看效果而已
- 个人记录-LeetCode 36. Valid Sudoku
- BP神经网络的原理及简单应用
- 关于如何在matlab中添加工具箱
- P1103
- javascript对文件的读写
- Struts2路径找不到类