• 买书(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 ;
    }
    
  • 相关阅读:
    可能是把 ZooKeeper 概念讲的最清楚的一篇文章
    Tomcat基本知识(一)
    PowerDesigner显示mysql数据表注释
    java中wait和notify的虚假唤醒问题
    为什么wait和notify只能在synchronized中?
    一篇blog带你了解java中的锁
    jvm类加载机制总结
    Java的浅拷贝与深拷贝总结
    政府网站公祭日,如何使网站整体变灰
    java 为什么重写equals一定要重写hashcode?
  • 原文地址:https://www.cnblogs.com/wk-love-zsy/p/13894360.html
Copyright © 2020-2023  润新知