题意:给一个上限 N个数字 求不超过这个上限的条件下 可以达到的最大和
思路:先用 0/1 背包的DP 来求出最优的上限和 再用DFS求出他的输出方案。由于自己刚刚接触DP 所以思路估计比较水 = =
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include <algorithm>
using namespace std;
int v[30];
int w[30];
int dp[10005];
int vis[30];
int n,m;
int tot=0;
bool flag;
int t[30];
int k;
int ans;
int dfs(int sum,int cur,int pos) //求出输出方案
{
// printf("sum=%d cur=%d\n",sum,cur);
if(flag==1)return 1;//保证只输出一种方案
if(sum==ans)
{
flag=1;
for(k=1;k<cur-1;k++)
printf("%d ",t[k]);
printf("%d ",t[k]);
printf("sum:%d\n",ans);
return 1;
}
else if(sum>ans)return 0;
for(int i=pos;i<=n;i++)
{
if(vis[i]==1)continue;
if(sum+v[i]<=ans)
{
vis[i]=1;
t[cur]=v[i];
dfs(sum+v[i],cur+1,i);
vis[i]=0;
}
}
}
int main()
{
while(scanf("%d%d",&tot,&n)!=EOF){
flag=false;
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
w[i]=v[i];
}
for(int i=1;i<=n;i++)
for(int j=tot;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]); //DP
}
ans=dp[tot];
dfs(0,1,1);
}
}