简单的背包问题,输出yy一下就可以了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define PB push_back
#define INS insert
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define nMax 100001
#define bug puts("Fuck");
#define LL long long
#define pb push_back
int n;
int dp[nMax],fa[nMax],vis[nMax];
int a[nMax],V;
void sovle(){
dp[0] = 1;
FOR(i,1,V) dp[i] = fa[i] = 0;
FOR(i,1,n) DOR(j,V,0) if(j>=a[i]) dp[j] += dp[j-a[i]];
if(dp[V] > 1) {
printf("-1\n");
}else if(dp[V] == 0) {
printf("0\n");
}else{
FOR(i,1,V) dp[i]=fa[i]=0;
FOR(i,1,n) DOR(j,V,0) if(dp[j]==0 && j>=a[i] && dp[j-a[i]]) dp[j]=1,fa[j]=i;
FOR(i,1,n) vis[i] = 0;
while(V){
if(fa[V] > 0) vis[fa[V]] = 1;
V -= a[fa[V]];
}
bool first = 1 ;
FOR(i,1,n)if(!vis[i]){
if(first) first=false;
else printf(" ");
printf("%d",i);
}
printf("\n");
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
// freopen("output.txt","w",stdout);
while(~scanf("%d",&V)){
scanf("%d",&n);
FOR(i,1,n) scanf("%d",&a[i]);
sovle();
}
return 0;
}
