求一个数字可以由指定几种数字组合的方法
我先用递推后用背包方法做的
递推代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=7600;
int n,f[maxn][6],c[6]={1,5,10,25,50};
void Init()
{
f[0][1]=f[0][2]=f[0][3]=f[0][4]=1;
for(int i=0;i<maxn;i++)
f[i][0]=1;
for(int i=1;i<maxn;i++)
for(int j=1;j<5;j++)
for(int k=0;c[j]*k<=i;k++)
f[i][j]+=f[i-c[j]*k][j-1];
}
int main()
{
Init();
while(scanf("%d",&n)!=EOF)
printf("%d\n",f[n][4]);
return 0;
}
背包代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=7500;
int n,f[maxn],num[5]={1,5,10,25,50};
void Init()
{
f[0]=1;
for(int i=0;i<5;i++)
for(int j=num[i];j<maxn;j++)
f[j]+=f[j-num[i]];
}
int main()
{
Init();
while(scanf("%d",&n)!=EOF)
printf("%d\n",f[n]);
return 0;
}