【发布时间】:2014-10-14 17:20:29
【问题描述】:
我正在解决一个 dp 问题。问题是我有 N 个骰子;他们每个人都有从 1 到 K 编号的 K 个面。现在我将 N 个骰子排成一行。如果我愿意,我可以旋转/翻转任何骰子。有多少种方法可以设置顶面,使所有顶面的总和等于 S?
现在给了我 N、K、S;我必须计算方法的总数。值得一提的是,我必须打印模 100000007 的结果。我试图解决这个问题并为此编写代码,但我的代码不适用于这种情况:800 800 10000 为什么?我不明白。谁能解释我的代码不起作用的原因。我的代码在这里:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<memory.h>
#define M 100000007
#define ull unsigned long long
using namespace std;
ull n,K,s,dp[1001][1001];
ull fnc(int num,int sum,int k)
{
ull temp;
if(num==0){
if(sum==0) return 1;
else return 0;
}
if(dp[num][k]!=-1)
return dp[num][k];
for(int i=1;i<=K;i++)
{
temp=temp%M+fnc(num-1,sum-i,i)%M;
}
return dp[num][k]=temp%M;
}
int main()
{
int T;
cin>>T;
for(int t=1;t<=T;t++)
{
cin>>n>>K>>s;
memset(dp,-1,sizeof(dp));
printf("Case %d: %lld\n",t,fnc(n,s,0));
}
return 0;
}
【问题讨论】:
-
你能用伪代码替换你的 C++ 代码吗?不是每个人都懂 C++,而且 C++ 也相当冗长。还要解释一下表格中每个单元格的含义
dp。 -
for dp[n][k] n 表示投掷次数,k 表示骰子的面值。
-
dp[n][k]应该包含什么?此外,所有这些都应该作为问题的一部分出现。 -
@YuvalFilmus 完全不清楚问题出在算法上,而不是实现上,因此伪代码可能无法解决问题。 (OTOH,将算法转换为伪代码可能会帮助提问者找出问题所在。)但是,无论如何,“请修复我的代码”在 CS.SE 上是题外话。如果添加了对代码预期行为的解释,那么它在Stack Overflow 上是合理的主题。
-
@YuvalFilmus 不,你不能。使用原始 C++ 中的代码,可能会发现算法和实现中的错误;在伪代码中使用它,只能找到算法中的错误。 (请注意,这一系列 cmets 来自 Computer Science SE 上帖子的原始位置。显然,Yuval 不会建议在 SO 上用伪代码替换代码。)