完全背包:
#include<stdio.h>
#include<string.h>
int dp[4][40000];
int main(void)
{
int i,j,n;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1; i<=3; i++)
{
for(j=0; j<32770; j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-i];
}
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",dp[3][n]);
}
return 0;
}
完全背包-滚动数组法:
#include<stdio.h>
#include<string.h>
int dp[40000];
int main(void)
{
int i,j,n;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=1; i<=3; i++)
{
for(j=i; j<32770; j++)
{
dp[j]+=dp[j-i];
}
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",dp[n]);
}
return 0;
}
和N层楼梯,最多一次上k次的不同在于,这个的2 1 2和2 2 1,也就是顺序的不同是算作一次的,在程序中的体现在于,楼梯问题的J是从1开始遍历,这个是从i开始遍历。
楼梯问题 第二次积分赛J题https://blog.csdn.net/cgmm2333/article/details/81393580