题目描述:
某小红薯在小红书的活动中抽奖中了一定价值的薯券,这些薯券可以用来购买一批商品,求有多少种购买组合。其中一件商品可以买多件。
输 入:薯券金额、商品分别价格
输出 :组合数
例:
输入 10 [2,3,5]
输出 4
题解:组合数:[2,2,2,2,2],[2,2,3,3],[2,3,5],[5,5]
解题思路:
动态规划,看了其他同学的代码,解释一下代码含义:一定要注意题述的输入形式,这道题中,输入是一个整数和一个字符串,读取到有效数字后,dp[j]=dp[j]+dp[j-data[i]], 其中,data[j]代表总数为j时一共可以有的组合方案。
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n, i = 0;
cin >> n;
int dp[10000] = { 0 };
dp[0] = 1;
vector<int> data;
string Stringdata;
cin >> Stringdata;
while (i < Stringdata.length())
{
if (Stringdata[i] != ' ' && Stringdata[i] != '[' && Stringdata[i] != ',' && Stringdata[i] != ']')
{
int sum = 0;
while (Stringdata[i] != ',' && Stringdata[i] != ']')
{
sum *= 10;
sum += Stringdata[i] - '0';
i++;
}
data.push_back(sum);
}
else
{
i++;
}
}
for (int c = 0; c < data.size(); c++) {
for (int j = data[c]; j <= n; j++) {
dp[j] += dp[j - data[c]];
}
}
cout << dp[n] << endl;
}
【 】