P1255
我永远讨厌高精度
就可以设置一个二维数组,因为既要记录是在哪一节台阶,又要记录这一届台阶上面种类数的各位数字·
以第几个台阶为形参,进行循环,len长度是通过判断下一位存不存在而+出来的
#include<bits/stdc++.h>
using namespace std;
int len=1;
int f[5001][5001]={0};
void jia(int k)
{
int i=0;
for(int i=1;i<=len;i++)
{
f[k][i]=f[k-1][i]+f[k-2][i];
if(f[k][i]>10)
{
f[k][i+1]+=f[k][i]/10;
f[k][i]=f[k][i]%10;
if(f[k][len+1])len++;
}
}
int main()
{
int n;
cin>>n;
f[1][1]=1;
f[2][1]=2;
for(int i=3;i<=n;i++)
jia(i);
for(int i=len;i>=1;i--)
cout<<f[n][i];
}
还有一种方法是用递推的思想来的,然后每一步都换成数组
memset很重要
P1028
就是两个循环啦,第一个循环是出来比自己小的数字,这是一轮递推,要加起来,第二个是出来这个以后的一半,这个也是递推,要加起来,这个递推可以得到相应一个i的
#include<bits/stdc++.h>//万能头文件
using namespace std;
int n;
int f[1001];//存每一位数的种类
int main(){
cin>>n;
for(int i=1;i<=n;i++){ //1-n的递推
for(int j=1;j<=i/2;j++){
f[i]+=f[j]; //每一位叠加,递推走起
}
f[i]++; //加上本身
}
cout<<f[n];//输出n的种类
return 0;
}
P2437
就和爬楼梯一样
P1164
背包绝了好吗,就是求方案数,所以是每次自己家自己,两次循环
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=10000+10;
int v[maxn],f[maxn];
int main(){
int n,m;
cin>>n>>m;
f[0]=1;
for(int i=1;i<=n;++i)
cin>>v[i];//读入 价值
for(int i=1;i<=n;++i)
for(int j=m;j>=v[i];--j)
f[j]+=f[j-v[i]];//现在的花费+=我不点这个菜的时候的花费
cout<<f[m]<<endl;最后把最后一个点的花费输出来就可以了
return 0;