SDUT2777-->小P的故事

题目概述:就是如今有1,2,3面值的纸币,给出指定n(n<32768),而后让你判断对于n元,1,2,3这些纸币一共有多少种构成n的方法。c++

思路:这个题主要是用动态规划中的背包思想,就是把大问题划分红若干个小问题,而后逐步解决小问题,最终,大问题就能够解决了。假设此时n为100,你就要算出99的时候的种数,而后再算出98,97........1的种数,而后最后把这些数加起来就好了。由于第一张只有1.2.3这三种中的一种,因此咱们能够经过这个来计算种数。假设i为第一张所取的纸币(1.2.3),而后j从i开始跑,直接跑到32768.算法

核心算法数组

int i,j;spa

for(i=1;i<=3;i++)ci

 {it

for(j=i;j<=32768;j++)方法

{动态规划

a[j]=a[j]+a[j-i];while

}co

下面是ac代码

#include<bits/stdc++.h> using namespace std; int a[33000];//记录种数 int main() {     int n;     memset(a,0,sizeof(a));//把数组a中的元素所有设为0     a[0]=1;//确保a[1]=1,也就是一元的时候只有一种状况。     for(int i=1;i<=3;i++)     {         for(int j=i;j<=33000;j++)         {             a[j]=a[j]+a[j-i];         }     }     while(cin>>n)     {         cout<<a[n]<<endl;     }     return 0; }