uva 624 CD

dp流,统计所有可能的情况,并且标记

博主为朱老师的学生

#include<cstdio>
#include<cstring>

const int maxn=10001;
int n,m,a[30],dp[maxn];
bool vis[maxn][30];
void inital()
{
    memset(vis,0,sizeof(vis));
    memset(dp,0,sizeof(dp));
}
int main()
{
    int i,j;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        inital();
        for( i=0; i<m; i++)
            scanf("%d",&a[i]);
        for(i=0; i<m; i++)
            for( j=n; j>=a[i]; j--)
                if(dp[j]<=dp[j-a[i]]+a[i])  //dp[j]中储存着最接近j的数 j >= dp[j]
                {
                    dp[j]=dp[j-a[i]]+a[i];
                    vis[j][i]=1;
                }
        for( i=m-1,j=n; i>=0; i--)
        {
            if(vis[j][i])
            {
                printf("%d ",a[i]);
                j-=a[i];
            }
        }
        printf("sum:%d\n",dp[n]);
    }
    return 0;
}


你可能感兴趣的:(uva 624 CD)