uva 10163

双重dp,dp两遍。。。。。好难

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[40][110],a[40];
int m,n;
int l,r;
const int inf=0x3f3f3f3f;
bool dfs()
{
    for(int i=0;i<=n;i++)
        dp[i][0]=inf;
        for(int i=1;i<=m;i++)
            dp[0][i]=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
        {
            dp[i][j]=dp[i-1][j];
            for(int k=0;k<j;k++)
            {
                dp[i][j]=max(dp[i][j],min(dp[i-1][k],a[i]/(j-k)));//寻找k到j符合规定的值
            }
        }
        if(dp[n][m]) l=dp[n][m];
        else return false;
        for(int i=0;i<=n;i++)
           dp[i][0]=0;
        for(int i=1;i<=m;i++)
            dp[0][i]=inf;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
            {  dp[i][j]=dp[i-1][j];
                  for(int k=0;k<j;k++)
                    if(a[i]/(j-k)>=l)//必须在上面符合规定的基础上寻找最小值
                  {
                      dp[i][j]=min(dp[i][j],dp[i-1][k]+a[i]);
                  }
            }
          r=dp[n][m];
        return true;
}
int main()
{
    while(~scanf("%d%d",&m,&n)&&m!=0&&n!=0)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        if(dfs()) printf("%d %d\n",l,r);
        else printf("0 0\n");
    }
    return 0;
}

 

posted on 2017-05-05 19:58  发牌员  阅读(134)  评论(0)    收藏  举报

导航