蓝桥

公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
2 2
5 0
输入:
2
500
800
则应输出:
1
2 0

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int count[1000];
int price[1000];
int ans[1000][1000];int num,n;
void dfs(int cnt,int sum,int money)
{
    int i;
    if(money==sum)
    {
        for(i=0;i<n;i++)
            ans[num][i] = count[i];
        ++num;
        return ;
    }
    if(sum>money || cnt>=n)
        return ;
    sum += price[cnt];
    ++count[cnt];
    dfs(cnt,sum,money);
    sum -= price[cnt];
    --count[cnt];
    dfs(cnt+1,sum,money);
}
int main()
{
    
    
    while(scanf("%d",&n)!=EOF)
    {
        int sum=0,i,j;num =0 ;
        for(i=0;i<n;i++)
        {
            scanf("%d",&price[i]);
        }
        dfs(0,0,1000);
        cout<<num<<endl;
        for(i=0;i<num;i++)
        {
            for(j=0;j<n;j++)
                printf("%d ",ans[i][j]);
            cout<<endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Deng1185246160/p/3603418.html