背包问题 打印路径是用一个vis数组来存  最后回溯输出

#include <algorithm>
#include <cstring>
#include <cstdio>

using std::max;
int n,m,w[25],dp[10010],vis[25][10005];
int main()
{
    while(scanf("%d %d",&m,&n)==2)
    {
        for(int i=1; i<=n; i++) scanf("%d",&w[i]);
        memset(dp, 0, sizeof(dp));
        memset(vis, 0, sizeof(vis));
        vis[0][0]=1;
        for(int i=n; i>0; i--)
        {
            for(int j=m; j>=w[i]; j--)
            {
                dp[j]=max(dp[j],w[i]+dp[j-w[i]]);
                if(dp[j]==dp[j-w[i]]+w[i])
                    vis[i][j]=1;
            }
        }
        for(int i=1, j=m; i<=n; i++)
            if(vis[i][j])
            {
                printf("%d ",w[i]);
                j-=w[i];
            }
        printf("sum:%d\n",dp[m]);
    }
    return 0;
}
View Code

 

posted on 2013-08-04 15:54  风流monkey  阅读(93)  评论(0)    收藏  举报