首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态规划-达到给定分数的不同组合数

动态规划-达到给定分数的不同组合数
EN

Stack Overflow用户
提问于 2016-06-16 04:51:18
回答 1查看 4.1K关注 0票数 7

考虑一场比赛,玩家可以在一次移动中得到3分、5分或10分。给定一个总分n,找到数个“不同”的组合才能达到给定的分数。

我的代码:

代码语言:javascript
复制
#include <iostream>
#include<unordered_map>
using namespace std;

unordered_map<int,int> m;

int numOfWays(int n){
    if(n==0)
        return 1;
    if(n<0)
        return 0;
    if(m[n]>0)
        return m[n];
    m[n] = numOfWays(n-3)+numOfWays(n-5)+numOfWays(n-10);
    return m[n];
}

int main(){
    int t; 
    cin>>t;
    cout<<numOfWays(t)<<endl;
    return 0;
}

对于输入11,我得到3作为输出,但不同的组合可能只有1。(11 =3+3+ 5)

如何修改上述代码以返回“不同”组合的数目?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-16 05:21:25

您可以通过强制执行一个约束来找到不同的组合,即每个组合中的元素必须单调增加(即每个元素等于或大于前一个元素)。所以(3,3,5)是允许的,但是(3,5,3)和(5,3,3)不允许。要实现这一点,只需向numOfWays传递一个最小值,以指示所有剩余值必须等于或大于此值。

代码语言:javascript
复制
int numOfWays(int n, int min){

数数如下方式的数量:

代码语言:javascript
复制
int ways = 0;
if(min <= 3)
   ways += numOfWays(n-3, 3);
if(min <= 5)
   ways += numOfWays(n-5, 5);
if(min <= 10)
   ways += numOfWays(n-10, 10); // from now on elements must be 10 or greater
m[index] = ways;

你在回忆录的时候也要考虑一下。您可以使用元组,或者只为n和min的每一个组合计算m中的唯一索引:

代码语言:javascript
复制
int index = (n * 10) + min;
if(m[index]>0)
    return m[index];

最初调用的最小值为1 (3也可以工作,但1是更一般的目的):

代码语言:javascript
复制
cout<<numOfWays(t,1)<<endl;
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37850116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档