0
已解决
陈曦
资深天翼
资深天翼
看了我同学的贴后,我按着他的思路写了一遍。然后,我也被卡住了:
#include<iostream>
#include<cstdio>
using namespace std;
long long n,a[5]={0,1,2,3};
long long f(long long t,long long n){
long long ans=0;
if(n==0 || n==1 ) return 1;
for(long long i=1;i<=3 && a[i]<=n;i++){
ans=ans+f(i,n-a[i]);
}
return ans;
}
int main(){
cin>>n;
cout<<f(1,n);
return 0;
}
0
0
张新杨
高级守护
高级守护
在函数中加记忆化搜索:a[45][45]
如果是n==a[n][t]且a[n][t]!=-1,直接return a[n][t],可以少一些循环次数,就不会超时
ps:a[n][t]初值为-1
0
陈梓恒
初级守护
初级守护
三个砖有四种搬法:111 12 21 3
在递归里也要写出n==2和n==3的if和return要不然只会for循环
我递归是这样写的
long long n,a[5]={0,1,2,4};
long long f(long long t,long long n){
long long ans=0;
if(n==0||n==1)return 1;
if(n==2)return 2;
if(n==3)return 4;
for(long long i=1;i<=3 && a[i]<=n;i++)
ans+=f(i,n-a[i]);
return ans;
}
不知道对不对