1799: 【基础】小明买书
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:6
解决:3
题目描述
新的学习开始了,小明来到书店采购辅导书。小明有M元,书店有N种不同的书,第i种书卖Ai元,假设小明每种书最多最能买1本,请问小明有多少种不同的买书方案?
输入
第一行有两个整数N和M。(1=<N<=100,1<=M<=10000)。
第二行有N个整数ai(1<=ai<=1000)。
第二行有N个整数ai(1<=ai<=1000)。
输出
输出一个整数,代表买书的方案数(请注意:本题的计算结果可能会超过int)
样例输入 复制
4 4
1 1 2 2
样例输出 复制
3
提示
#include <iostream>
using namespace std;
const int N = 105;
const int M = 10005;
long long dp[N][M];
int a[N];
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
dp[0][0] = 1;
for(int j = 1; j <= m; j++)
dp[0][j] = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= m; j++)
{
dp[i][j] = dp[i-1][j];
if(j >= a[i])
{
dp[i][j] += dp[i-1][j - a[i]];
}
}
}
// ✅直接输出 dp[n][m],恰好花m元的方案
cout << dp[n][m] << endl;
return 0;
}
#include <iostream>
using namespace std;
const int MAXM = 10000;
long long dp[MAXM + 1];
int main()
{
int n, m;
cin >> n >> m;
dp[0] = 1;
for(int i = 1; i <= m; i++) dp[i] = 0;
for(int i = 1; i <= n; i++)
{
int a;
cin >> a;
for(int j = m; j >= a; j--)
{
dp[j] += dp[j - a];
}
}
cout << dp[m] << endl;
return 0;
}