01背包:
/* W w w mm mm 222222222 7777777777777 */
/* W w w w m m m m 222 22 7777 */
/* w w w w m m m m 22 777 */
/* w w w w m m m m 22 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* w w w w m m m m 222 77 */
/* ww ww m mm m 222222222222222 77 */
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int V,n,sum,m,flag;
int w[25],dp[25][10005],vis[25];
void dfs(int x,int cur)
{
//printf("x=%d cur=%d\n",x,cur);
if(!flag)return;
if(x==n+1&&cur!=sum)return;
if(cur==sum)
{
for(int i=1;i<=n;i++)
{
if(vis[i])printf("%d ",w[i]);
}
flag=0;
return;
}
vis[x]=1;
dfs(x+1,cur+w[x]);
vis[x]=0;
dfs(x+1,cur);
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("test.in","r",stdin);
#endif
while(~scanf("%d",&V))
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=0;j<=V;j++)
{
if(j<w[i])
{
dp[i+1][j]=dp[i][j];
}
else
{
dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+w[i]);
}
}
}
memset(vis,0,sizeof(vis));
sum=dp[n+1][V];
flag=1;
dfs(1,0);
printf("sum:%d\n",sum);
}
}