收银员现有 n 张面值分别为 v1,v2,...,vn 的纸币。若找零金额为 m,则一共有多少种找零方法?
注:0<n≤1000,0<v1,v2,...,vn≤10000,0<m≤10000
输入格式
n v1,v2,...,vn m
输出格式
若有解,则输出全部找零方案,每输出一种 若无解,则输出“None”
输入样例1
6
3 1 4 3 2 7
9
输出样例1
3 1 3 2
3 4 2
4 3 2
2 7
输入样例2
5
5 3 4 6 7
2
输出样例2
None
先考虑要这一个,再考虑不要这一个。先考虑要这一个,再考虑不要这一个。先考虑要这一个,再考虑不要这一个。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
const int maxn=10010;
int n,m,cnt=0;
int a[maxn];
void dfs(int sum,int i,vector<int> vi){
if(sum>m){
return ;
}
if(sum==m){
cnt=1;
for(int i=0;i<vi.size();i++){
if(i) cout<<" ";
cout<<vi[i];
}
cout<<endl;
return ;
}
if(i==n){
return ;
}
vi.push_back(a[i]);
dfs(sum+a[i],i+1,vi);
vi.pop_back();
dfs(sum,i+1,vi);
}
int main(){
int sum=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
cin>>m;
if(sum<m){
cout<<"None"<<endl;
return 0;
}
vector<int> vi;
dfs(0,0,vi);
if(cnt==0){
cout<<"None";
}
}