码蹄集 万民堂大厨

 运行时错误:

#include<bits/stdc++.h> 

using namespace std;

const int mod = 1e9+7;

vector<vector<long long int>> res;
vector<long long int> arr2;
long long int target;
long long int start,last=0;
vector<long long int> temp;
long long int tim=0;

int OK(vector<long long int>a,long long int k,long long int i)//判断是否有重复元素
{
    if(i>k)//保证数组存在的时候
    for(int t=k;t<i;t++)//循环查找
    {
        if(a[t]==a[i])
        return 0;
    }
        return 1;
}

void Perm(vector<long long int>a,long long int k,long long int m)//全排列的实现函数
{
    if(k==m)//只剩下1个元素
    {
        tim++;//次数+1
//        for(int i=0;i<=m;i++)
//        {
//            cout<<a[i];
//        }
//        cout<<"\n";
    }
    else  //还有多个元素待排列
    {
        for(int i=k;i<=m;i++)//有几个元素就循环几次(因为以它打头,然后对后面的数进行全排列)
        {
            if(OK(a,k,i))//当不存在重复元素的时候,才进行全排列
            {
                swap(a[k],a[i]);//进行交换
                Perm(a,k+1,m);
                swap(a[k],a[i]);
            }
        }
    }
}

int helper(vector<long long int> arr, long long int target, vector<long long int> arr2, long long int index){
	if(target==0)
	{
		res.insert(res.end(),arr2);
	}
	
	for(int i=index; i<arr.size();i++){
		if(arr[i] <= target){
			arr2.insert(arr2.end(),arr[i]);
			helper(arr, target-arr[i], arr2, i);
			arr2.pop_back();
		}
	}
}

vector<vector<long long int>> combinationSum(vector<long long int> arr, long long int target){
	helper(arr, target, arr2, 0);
	return res;
} 

int main()
{
    vector<long long int> arr;  //原始数组 
   	long long int n,m,k,x;  
    cin >> x >> n >> m >> k;

	target = x;
    arr.insert(arr.end(),n);
    arr.insert(arr.end(),m);
    arr.insert(arr.end(),k);

    combinationSum(arr,target);
    
    for(int i=0;i<res.size();i++){ 
    	for(int j=0;j<res[i].size();j++){
    		start = 0; 		
    		temp.insert(temp.end(), res[i][j]);
		}

		last = res[i].size()-1;
		Perm(temp, start, last);
		temp.clear();
	}
    
    if(tim){
        cout << tim%mod;
    }
    else{
        cout << "impossible";
    }

//	cout << "组成的数量为:" << tim ; 
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值