薯券使用问题
多元一次不定方程求非负整数解数
题目描述:
某小红薯在小红书的活动中抽奖中了一定价值的薯券,这些薯券可以用来购买一批商品,求有多少种购买组合。其中一件商品可以买多件。输入:薯券金额、商品分别价格输出:组合数
输入:
输入薯券金额、商品分别价格输出,
例如:10[2,3,5],10与[2,3,5]中间有空格
输出:
有多少种购买方式
样例:
输入:
10 3
2 3 5
输出:
4
解释:
2 2 2 2 2
2 2 3 3
2 3 5
5 5
思路:
听说NM都有10万,当然是先暴力数数看啊,超高O(n^m)复杂度。就是求
的非负整数解的解数
代码:
#include <cstdio>
#include <vector>
using namespace std;
int n,money,res=0;
int a[10010];
vector<int> resS;
int dfs(int left,int lost)
{
if(lost == 0)
{
for(vector<int>::iterator it=resS.begin();it<resS.end();it++)
printf("%d ",*it);
printf("\n");
res++;
return 1;
}
for(int i=left;i<=n;i++)
{
if(lost>=a[i])
{
resS.push_back(a[i]);
dfs(i,lost-a[i]);
resS.pop_back();
}
}
return 0;
}
int main()
{
scanf("%d",&money);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs(1,money);
printf("%d\n",res);
return 0;
}
优化完全没想到啊