- 岳麓山上打水
- 2017-08-17 13:13:35 @
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
int a[105], f[20005], g[20005];
bool isget[105];
stack<int > ans;
int main()
{
memset(g, -1, sizeof(g));
memset(f, 0x3f, sizeof(f));
f[0]=0;
g[0]=0;
int m, n;
cin>>m>>n;
for(int i=1;i<=n;i++) scanf("%d", &a[i]);
sort(a+1, a+1+n);
for(int i=1;i<=n;i++)
for(int j=a[i];j<=m;j++){
int tmp=f[j-a[i]];
if(g[j-a[i]]!=i) tmp++;
if(tmp<f[j]){
f[j]=tmp;
g[j]=i;
}
}
cout<<f[m]<<' ';
int k=m;
while(k){
if(!isget[g[k]]){ ans.push(a[g[k]]); isget[g[k]]=true; }
k-=a[g[k]];
}
while(!ans.empty()){ cout<<ans.top()<<' '; ans.pop(); }
cout<<endl;
return 0;
}