买书(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 ;
}