题目大意是,现在只有1,2,3的硬币若干,问指定一个数,有多少种分法;
我当初一看到这个题就直接无脑的想把一个状态看成三个子状态的和(也就是f4=f1+f2+f3),这其实是不对的,因为这样的话,f4的值你会发现是6,其实应该是3,产生这个错误的原因是因为如果直接相加的话会有重复和漏项。
那么这道题的正确思路应该是:
使用两个for循环,第一个循环代表硬币的值,第二个表示每个数的分法,这样的话就可以有效的把每一种情况都考虑到比如1,1,2这在我上面说的那个是没有这种情况的
那么只要搞明白这一点相信代码就不难写出
代码:
代码:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
long long dp[40000];
//int change[3]={1,2,3};
void solve()
{
dp[0]=1;
for(int i=1;i<=3;i++)
{
for(int j=i;j<=32768;j++)
{
dp[j]+=dp[j-i];
}
}
}
int main()
{
ios::sync_with_stdio(false);
solve();
int n;
while(scanf("%d",&n)!=EOF)
{
cout<<dp[n]<<endl;
}
return 0;
}
另外之前没学过dp,不知道原来这就是dp的一种形式,我之前都把它当做递推和找规律做的