买书(dp)

小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。

问小明有多少种买书方案?(每种书可购买多本)

输入格式
一个整数 n,代表总共钱数。

输出格式
一个整数,代表选择方案种数。

数据范围
0≤n≤1000
输入样例1:
20
输出样例1:
2
输入样例2:
15
输出样例2:
0
输入样例3:
0
输出样例3:
1

思路:
这里就是一个完全背包问题 每一本书可以一直买 然后我有N元 ,这里唯一多了一个条件就是一直买 相比于0 1 背包而且要恰好等于我总共的钱; 一样先枚举每一本书 然后从小到大去枚举我的钱的数目,
假设我们有20元,需要得到买加上不买这本书得到的方案数 这里与 01背包不相同 01背包每一个物品只能去一次 这里可以无限取 ,如何保证能每一次把钱恰好用完 在遍历的时候能得到的一定是倍数

#include <iostream>
#include <cstring>
using namespace std;
int n ;
const int N = 1010;
int dp[N];
int main()
{
    /*
    小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。

     问小明有多少种买书方案?(每种书可购买多本)
    */
   cin >> n ; 

   int q[4] = {10,20,50,100};
 dp[0] = 1;
   for(int i = 0 ; i < 4 ; i ++)
   {
       for(int j = 1 ; j <= n ; j ++)
       {
           
           if( q[i] <= j)
           {
               dp[j] += dp[j- q[i]] ;//这里因为需要用到上一层的数 所有顺序遍历
              //dp[i][j] = dp[i-1][j]+dp[i-1][j-v]; 这里我们在遍历的时候已经得到了i-1所以不需要
           }
          
       }
       
   }
   cout << dp[n] << endl;
   
   return 0 ;
}
原文地址:https://www.cnblogs.com/wk-love-zsy/p/13894360.html