【发布时间】:2020-11-18 12:59:50
【问题描述】:
动态编程题:
考虑一个玩家可以在一个游戏中获得 3 或 5 或 10 分的游戏 移动。
给定总分 n,找出达到给定分数的不同组合的数量。
我正在尝试使用递归+记忆来解决它。
我的仅递归方法:
long long int countrecur(long long int n, long long int min)
{
if (n==0)
return 1;
else if(n<0)
return 0;
else
{
long long int ans=0;
if(min<=3)
ans+=countrecur(n-3,3);
if(min<=5)
ans+=countrecur(n-5,5);
if(min<=10)
ans+=countrecur(n-10,10);
return ans;
}
}
long long int count(long long int n)
{
return countrecur(n,0);
}
它似乎有效,但我无法找到如何记住子问题的结果。
递归+记忆尝试:
#include<iostream>
#include<vector>
using namespace std;
long long int countrecur(long long int n, long long int min, vector<long long int> &dp)
{
if (n < 3 && n!=0)
return 0;
if (n == 0||dp[n]!=0)
return dp[n];
else
{
long long int ans = 0;
if (min <= 3)
ans += countrecur(n - 3, 3,dp);
if (min <= 5)
ans += countrecur(n - 5, 5,dp);
if (min <= 10)
ans += countrecur(n - 10, 10,dp);
dp[n] = ans;
return ans;
}
}
long long int count(long long int n, vector<long long int>& dp)
{
return countrecur(n, 0,dp);
}
int main()
{
int n;
cin >> n;
vector<long long int>dp(n+1, 0);
dp[0] = 1;
cout << count(n,dp) << endl;
}
对于像 n=20 这样的输入似乎失败了,其中一些分支在递归树的根部变得相等。
20=15+5; 20={10,5}+{5}={10,5,5}
20=10+10; 20={5,5}+{10}={5,5,10}
【问题讨论】:
标签: algorithm recursion dynamic-programming