迭代加深搜索。
一开始写了个完全背包,但只能过几个测试点,发现它有些情况不能很好的判断。
好在迭代加深并不难写。
/*
ID: modengd1
PROG: milk4
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
#include <vector>
using namespace std;int input[100];
int Q,P;
int ans[100];
int dp[20001];
bool DFS(int deep,int index,int limit)//deep是当前层深也是就是该取第几个数了,index是前一个数在input数组中的下标。limit是本次搜索要找的集合的大小
{if(deep==limit){memset(dp,false,sizeof(dp));dp[0]=true;for(int i=0;i<limit;i++){for(int j=ans[i];j<=Q;j++){dp[j]|=dp[j-ans[i]];}}if(dp[Q]){cout<<limit;for(int i=0;i<limit;i++)cout<<' '<<ans[i];cout<<endl;return true;}elsereturn false;}for(int i=index+1;i<=P-(limit-deep-1);i++){ans[deep]=input[i];if(DFS(deep+1,i,limit))return true;}return false;
}
int main()
{freopen("milk4.in","r",stdin);freopen("milk4.out","w",stdout);scanf("%d",&Q);scanf("%d",&P);for(int i=0;i<P;i++){scanf("%d",&input[i]);}sort(input,input+P);for(int i=1;i<=P;i++){if(DFS(0,-1,i))break;}return 0 ;
}