有一个算法题请大佬指点!

hanhf 2018-09-03 04:00:27
有一个算法题请大佬帮忙看一下。
在某个游戏中,一个游戏主角有10个位置可以放置英雄卡牌,例如位置1可以为主角添加英雄卡牌生命值的5%,位置2可以为主角添加英雄卡牌攻击力的7%(这里面有些位置增加的属性是一样的,例如可以有两个位置都增加生命)。。。
游戏主角有一些特性如生命值、攻击力、魔法防御、物理防御等。。。
现在我手里有20个英雄卡牌,部分英雄偏生命和攻击,例如生命12000攻击8000物防1200法防1200,另外一些英雄则偏法防,总之每个英雄的各项数值不一样。。。
请问如何在合适的位置放上合适的英雄卡牌,使主角所获得的“属性增加总值”最大。
...全文
646 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
-瞌睡虫- 2018-09-14
  • 打赏
  • 举报
回复
引用 12 楼 qq_39936465 的回复:
你的算法是有问题的,你还是没搞懂意思啊,虽然增加的能力值 比率确实会根据总值下降,但是下降的只是比率,增加的值还是不变啊,

那你的例子来说
位置1
12000*5%=600
8000*7%=560

位置2
12000*5%=600
8000*7%=560

功1000 生命 2200 总计 3200> 1560+1600=3160

题主 要求的是增加属性总值最大。


我知道这样算法是有问题的,我也说了,只能让所有属性整体提升,不会有短腿属性,
那就如你所说的都放增值最大的位置,这不就总属性值最大了,没啥好说的
qq_39936465 2018-09-14
  • 打赏
  • 举报
回复
而且卡槽只是添加单一能力,哪里像你这个可以多个能力可选的,你这样变相增加了判定的难度

也就是说你有2张卡

卡1 生12000 力8000
卡2 生 15000 力5000

卡槽1 生命5%
卡槽2 力量7%

很明显
卡2 放入 卡槽1
卡1 放入 卡槽2

例2

卡1 生命15000 力8000
卡2 生命 12000 力 5000

卡槽1 生5%
卡槽2 力7%

这个时候理论上都应该放入卡1 2个卡槽都会得到最大值,实际上卡就1张,所以要判断 卡1放入哪个卡槽等到能力最大

卡1放入卡槽1 15000*5%=750
卡1放入卡槽2 8000*7%=560

750>560

所以卡1 放入卡槽1 ,卡2 替补放入卡槽2.

题主所说的是有10个卡槽

卡槽增加能力y = 卡牌的属性能力 m * 卡槽属性增加比率 n 当m值不变时 n越大 y越大 也就是说同一张卡放入 比率最高的卡槽 能力增加越多

同理当n值不变时 m越大 y越大 也就是说同一个卡槽 放入的卡牌属性越大 y越大


这样的话我们首先对卡槽的属性比率分别进行排序 由大到小

然后对所有的卡牌进行排序 也是由大到小

然后根据 根据各属性卡槽数 取前几位 然后再进行 判断 放入哪个卡槽合适

举例来说 一共有3个生命卡槽增加生命比率为 s1、s2、s3,那我们只要把所有卡按生命排序 从大到小 取生命最大的前3张 c1、c2、c3

做个循环判断 得到 增加生命最大值,其他属性也做类似操作。

如果同1张卡被用了2次,这里就要添加替补卡牌进行判断

举例来说

生命卡槽3个 生命卡 从大到小 排列 c1 c2 c3 c4。。。。。
力量卡槽3个 力量卡 从大到小 排列 c1 c5 c6 c7。。。。。

c1 被用到2次

这时候就要进行判断 首先c1 被放入 生命卡槽中用到 c1 c2 c3 ,力量卡槽只能用 c5 c6 c7 分别求最大值然后相加等于y1
然后把c1 放入力量卡槽 这时候 生命卡槽 用到c2 c3 c4, 力量卡槽用 c1 c5 c6 分别求最大值然后相加等于y2

y1 大于y2 c1 被放入生命卡槽, y1小于y2 c1 被放入力量卡槽。

卡牌没有被重复使用 配卡完成得到增加属性最大值。

多卡关联属性重复也可以通过求最大增加属性进行判断。







qq_39936465 2018-09-14
  • 打赏
  • 举报
回复
引用 11 楼 liangshilin 的回复:
[quote=引用 10 楼 qq_39936465 的回复:]
[quote=引用 9 楼 liangshilin 的回复:]
[quote=引用 7 楼 qq_39936465 的回复:]
[quote=引用 6 楼 liangshilin 的回复:]
计算一张英雄卡在所有位置上对那个属性的增幅,然后取增幅最大的位置!
如:位置1增加生命值,生命增幅=增加值 x 增值率 / 原生命值 + 增加值 x 增值率;
位置2增加攻击力,攻击增幅=增加值 x 增值率 / 原生攻击力 + 增加值 x 增值率;
同理算出其他位置的属性增幅,然后取增幅最大的位置,不论属性。


你这个公式完全没有意义,m/(c+m) , c为常 ,当m趋向无穷大是 ,得到最大值趋向1,也就是说m值越大越好,m=增加值*增值率,增值率固定的话,增加值越大越m值越高。你还没考虑生命和攻击最大值都在一张卡上的情况呢?[/quote]

不说增加值会不会出现趋于无穷,就算当m趋于无穷大增幅确实是趋向1,然后它增幅最大,然后选择这个位置放置卡牌有问题吗?
发生生命和攻击最大值都在一张卡上的情况,任选一个位置都没错啊,不行就看个人偏好设置一下不就行了。

这样不会有某个属性无限增加,因为c值越大,后面想要更高的增幅就要更高的增值。如果你说他每张牌都对生命有趋于无限的增值,那这样真不行了,生命值直接上天。
[/quote]

你没搞懂我的意思啊,y=m/(c+m)=(m+c-c)/(c+m)=1-c/(c+m) 这个就是一个简单的正比线性函数,m值越大y值越大,c就是原生命力是常数。
他卡牌值不定的话,肯定越大越好咯,也就是说卡槽里只要放对应的最大值卡就行了。[/quote]

是你没懂我的意思,m越大确实y就越大,但是c会随着防止卡牌而增大的!
算了,我直接拿数据举例子吧:
假设:
原功:1000 , 原生:1000
位置1:+5%生 , 位置2:+7%功
有两张卡牌,都是:+12000生 , +8000功
生增幅=12000*5% / 1000+12000*5%=0.375
攻增幅=8000*7% / 1000+8000*7% 约等于 0.35897
生增幅 > 功增幅 放位置 1 这时 攻加上增加的后:功:1000 生:1600
放第二张牌时:
生增幅=12000*5% / 1600+12000*5%=0.2727
功增幅=8000*7% / 1000+8000*7% 约等于 0.35897
功增幅 > 生增幅 这时就该放位置 2了
这时,功:1560,生:1600

多个属性多张卡牌算法是一样。

扩展到多个是一样的,如果增幅都一样,那就看自己偏好了。
这样能不能达到“属性增加总值”最大,那还真不好说,因为我都不知道怎么才算“属性增加总值”最大。
不过这样能保证不会有缺腿属性。[/quote]

你的算法是有问题的,你还是没搞懂意思啊,虽然增加的能力值 比率确实会根据总值下降,但是下降的只是比率,增加的值还是不变啊,

那你的例子来说
位置1
12000*5%=600
8000*7%=560

位置2
12000*5%=600
8000*7%=560

功1000 生命 2200 总计 3200> 1560+1600=3160

题主 要求的是增加属性总值最大。



qq_39936465 2018-09-13
  • 打赏
  • 举报
回复
引用 9 楼 liangshilin 的回复:
[quote=引用 7 楼 qq_39936465 的回复:] [quote=引用 6 楼 liangshilin 的回复:] 计算一张英雄卡在所有位置上对那个属性的增幅,然后取增幅最大的位置! 如:位置1增加生命值,生命增幅=增加值 x 增值率 / 原生命值 + 增加值 x 增值率; 位置2增加攻击力,攻击增幅=增加值 x 增值率 / 原生攻击力 + 增加值 x 增值率; 同理算出其他位置的属性增幅,然后取增幅最大的位置,不论属性。
你这个公式完全没有意义,m/(c+m) , c为常 ,当m趋向无穷大是 ,得到最大值趋向1,也就是说m值越大越好,m=增加值*增值率,增值率固定的话,增加值越大越m值越高。你还没考虑生命和攻击最大值都在一张卡上的情况呢?[/quote] 不说增加值会不会出现趋于无穷,就算当m趋于无穷大增幅确实是趋向1,然后它增幅最大,然后选择这个位置放置卡牌有问题吗? 发生生命和攻击最大值都在一张卡上的情况,任选一个位置都没错啊,不行就看个人偏好设置一下不就行了。 这样不会有某个属性无限增加,因为c值越大,后面想要更高的增幅就要更高的增值。如果你说他每张牌都对生命有趋于无限的增值,那这样真不行了,生命值直接上天。 [/quote] 你没搞懂我的意思啊,y=m/(c+m)=(m+c-c)/(c+m)=1-c/(c+m) 这个就是一个简单的正比线性函数,m值越大y值越大,c就是原生命力是常数。 他卡牌值不定的话,肯定越大越好咯,也就是说卡槽里只要放对应的最大值卡就行了。
-瞌睡虫- 2018-09-13
  • 打赏
  • 举报
回复
引用 7 楼 qq_39936465 的回复:
[quote=引用 6 楼 liangshilin 的回复:]
计算一张英雄卡在所有位置上对那个属性的增幅,然后取增幅最大的位置!
如:位置1增加生命值,生命增幅=增加值 x 增值率 / 原生命值 + 增加值 x 增值率;
位置2增加攻击力,攻击增幅=增加值 x 增值率 / 原生攻击力 + 增加值 x 增值率;
同理算出其他位置的属性增幅,然后取增幅最大的位置,不论属性。


你这个公式完全没有意义,m/(c+m) , c为常 ,当m趋向无穷大是 ,得到最大值趋向1,也就是说m值越大越好,m=增加值*增值率,增值率固定的话,增加值越大越m值越高。你还没考虑生命和攻击最大值都在一张卡上的情况呢?[/quote]

不说增加值会不会出现趋于无穷,就算当m趋于无穷大增幅确实是趋向1,然后它增幅最大,然后选择这个位置放置卡牌有问题吗?
发生生命和攻击最大值都在一张卡上的情况,任选一个位置都没错啊,不行就看个人偏好设置一下不就行了。

这样不会有某个属性无限增加,因为c值越大,后面想要更高的增幅就要更高的增值。如果你说他每张牌都对生命有趋于无限的增值,那这样真不行了,生命值直接上天。
qq_39936465 2018-09-13
  • 打赏
  • 举报
回复
单个卡槽来说插入对应的属性值最大,得到的值最大。按四属性从大到小分别排个序,卡槽也按属性的增幅率从大到小排个序,然后从大到小依次放入卡牌(例如:生命2个卡槽就增幅率最高放入最大的卡,另一个放入第2大的卡),万一卡牌重复了,1张卡放入2个槽,再比较一下 对应的属性增幅 哪个属性增幅大 放入那个属性卡槽,另一个属性卡槽用次大的替补,直到全部放满卡槽,得到最大值。
qq_39936465 2018-09-13
  • 打赏
  • 举报
回复
引用 6 楼 liangshilin 的回复:
计算一张英雄卡在所有位置上对那个属性的增幅,然后取增幅最大的位置!
如:位置1增加生命值,生命增幅=增加值 x 增值率 / 原生命值 + 增加值 x 增值率;
位置2增加攻击力,攻击增幅=增加值 x 增值率 / 原生攻击力 + 增加值 x 增值率;
同理算出其他位置的属性增幅,然后取增幅最大的位置,不论属性。


你这个公式完全没有意义,m/(c+m) , c为常 ,当m趋向无穷大是 ,得到最大值趋向1,也就是说m值越大越好,m=增加值*增值率,增值率固定的话,增加值越大越m值越高。你还没考虑生命和攻击最大值都在一张卡上的情况呢?
-瞌睡虫- 2018-09-13
  • 打赏
  • 举报
回复
引用 10 楼 qq_39936465 的回复:
[quote=引用 9 楼 liangshilin 的回复:]
[quote=引用 7 楼 qq_39936465 的回复:]
[quote=引用 6 楼 liangshilin 的回复:]
计算一张英雄卡在所有位置上对那个属性的增幅,然后取增幅最大的位置!
如:位置1增加生命值,生命增幅=增加值 x 增值率 / 原生命值 + 增加值 x 增值率;
位置2增加攻击力,攻击增幅=增加值 x 增值率 / 原生攻击力 + 增加值 x 增值率;
同理算出其他位置的属性增幅,然后取增幅最大的位置,不论属性。


你这个公式完全没有意义,m/(c+m) , c为常 ,当m趋向无穷大是 ,得到最大值趋向1,也就是说m值越大越好,m=增加值*增值率,增值率固定的话,增加值越大越m值越高。你还没考虑生命和攻击最大值都在一张卡上的情况呢?[/quote]

不说增加值会不会出现趋于无穷,就算当m趋于无穷大增幅确实是趋向1,然后它增幅最大,然后选择这个位置放置卡牌有问题吗?
发生生命和攻击最大值都在一张卡上的情况,任选一个位置都没错啊,不行就看个人偏好设置一下不就行了。

这样不会有某个属性无限增加,因为c值越大,后面想要更高的增幅就要更高的增值。如果你说他每张牌都对生命有趋于无限的增值,那这样真不行了,生命值直接上天。
[/quote]

你没搞懂我的意思啊,y=m/(c+m)=(m+c-c)/(c+m)=1-c/(c+m) 这个就是一个简单的正比线性函数,m值越大y值越大,c就是原生命力是常数。
他卡牌值不定的话,肯定越大越好咯,也就是说卡槽里只要放对应的最大值卡就行了。[/quote]

是你没懂我的意思,m越大确实y就越大,但是c会随着防止卡牌而增大的!
算了,我直接拿数据举例子吧:
假设:
原功:1000 , 原生:1000
位置1:+5%生 , 位置2:+7%功
有两张卡牌,都是:+12000生 , +8000功
生增幅=12000*5% / 1000+12000*5%=0.375
攻增幅=8000*7% / 1000+8000*7% 约等于 0.35897
生增幅 > 功增幅 放位置 1 这时 攻加上增加的后:功:1000 生:1600
放第二张牌时:
生增幅=12000*5% / 1600+12000*5%=0.2727
功增幅=8000*7% / 1000+8000*7% 约等于 0.35897
功增幅 > 生增幅 这时就该放位置 2了
这时,功:1560,生:1600

多个属性多张卡牌算法是一样。

扩展到多个是一样的,如果增幅都一样,那就看自己偏好了。
这样能不能达到“属性增加总值”最大,那还真不好说,因为我都不知道怎么才算“属性增加总值”最大。
不过这样能保证不会有缺腿属性。
-瞌睡虫- 2018-09-12
  • 打赏
  • 举报
回复
计算一张英雄卡在所有位置上对那个属性的增幅,然后取增幅最大的位置!
如:位置1增加生命值,生命增幅=增加值 x 增值率 / 原生命值 + 增加值 x 增值率;
位置2增加攻击力,攻击增幅=增加值 x 增值率 / 原生攻击力 + 增加值 x 增值率;
同理算出其他位置的属性增幅,然后取增幅最大的位置,不论属性。

qq_39936465 2018-09-12
  • 打赏
  • 举报
回复
设生命槽 a个b% 力量c个d% 物防e个f% 法防g个h% 卡槽内卡生命总量w,力量总量x,物防总量y,法防总量z a+b+c+d=10 w*b%+x*d%+y*f%+z*h%趋向最大。 这个怎么求解?都是未知数,范围太大了。先设定百分比的上下限和生命力量最大最小值再来分析才有意义。
2018-09-12
  • 打赏
  • 举报
回复
感觉太复杂啦。如果每个卡牌都有攻击x,生命值y,一共有4个卡牌,一共有4个槽。
那么就是判断4个中取两个x,4个中取两个y进行组合。

如果卡牌的攻击和生命值相差较大,总会有很多区别还好。
理论上,将攻击力加成最高的位置,配上攻击力最高的卡牌就好。可如果这种卡牌其他属性也很高,如果将这个高攻击力的卡牌放入该攻击槽中,那么可能导致加生命值槽的位置所放入的卡牌的收益太低。
所以,即便你知道某张牌放在某个位置能够使得其收益最高,也不能确定其放在该位置能够获得最大的收益。
Dan淡淡的心 2018-09-07
  • 打赏
  • 举报
回复
很简单啊 既然是根据卡牌的属性来走 那么卡牌的属性值越高 加成就越高 那么根据每个对应的属性 给卡牌排出优先级 根据第一序列来选 若是第一序列中 出现单张卡牌在该属性称王 其他属性靠后 则该卡牌选中 并在其他次序中删除该卡牌 出现副属性也称王的 比较自身属性对应卡槽加成属性高的 然后姜卡牌放入改卡槽 删除其他 其他次序中 的卡牌顺延排序 卡槽加成属性一样的随机卡槽 百分比不一样的 优先高的 总的思路就是 矮子里边选高个 谁高谁来
  • 打赏
  • 举报
回复
1,首先可能想到得是 让某属性(以生命值为例)最高的放置在对生命值加成最高的位置。
2,但是,可能会出现这样一个问题,向上述放置,可能会出现生命值最高的英雄在获得加成后的总属性没有生命值第二高的英雄高,那么这样需要对生命值这一属性进行筛选。
3,如果有一英雄两种属性都最高,则也需要判断,同样的还有对应的总属性问题。
4,等等。。。
叮咚呛咚呛 2018-09-06
  • 打赏
  • 举报
回复
老铁 感觉你这个说的好像还有点问题吧,你这个偏生命和攻击,值得是基础属性或者说是加成吧,你这个属性增加总值最大指啥米?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧