笔试题目

小安去超市购物,妈妈给了一些零钱,面值有1元,5元,10元,20元,50元,100元.

超市结账时一共需要花M元,小安很好奇,如果不用找零,可以有多少种方式的组合来组成M元,你可以编程帮他得到答案吗?

输入描述:

第一行包含6个整数,分别代表1,5,10,20,50,100每种面值的数目。

假设输入是6 5 4 3 2 1,则代表1元有6张,5元有5张,。。。。。。

第二行是一个整数,代表需要多少钱。

假设输入是11,含义为要凑11元。

 

输出描述

输出为一个整数,这个整数是各种组合的长度之和。

 

示例:

6 5 4 3 2 1

11

输出

12

采用的回溯算法,为防止数据重复,采用了set。

#include 
#include 
#include 

using namespace std;
const vector store{1,5,10,20,50,100};
vector A;

void help(set > &result,vector vec,vector A,int i,int M){
    if(M==0) {
        result.insert(vec);
        return;
    }
    if(i>A.size()){//没钱了
        return;
    }
    if(A[i]<=M){
        vec.push_back(A[i]);
        M=M-A[i];
        help(result,vec,A,i+1,M);
        vec.pop_back();
        M=M+A[i];
        help(result,vec,A,i+1,M);
    }
}
int func(vector A,int M){
    if(A.empty())
        return -1;
    set >result;
    vector vec;
    int i=0;
    help(result,vec,A,i,M);
    int _sum=0;
    set >::iterator it;
    for(it=result.begin();it!=result.end();++it){
        _sum+=it->size();
    }
    return _sum;
}
int main(){
//    vector B{6,5,4,3,2,1};
//    int M=11;
    vector B;
    int tmp;
    while(cin>>tmp){
        B.push_back(tmp);
    }
    int M;
    cin>>M;
    for(int i=0;i<6;++i){
        for(int j=0;j

 

你可能感兴趣的:(c++)