uva 12563 - Jin Ge Jin Qu hao(动态规划~劲!歌!金!曲!)

错的我真是无语。。。还是状态的把握不准确。。

起始状态转移方程是很重要,但是只推出了方程是不够的

对边界状态的处理,对特殊状态的处理,这些都很重要,错了任何一个小地方,都会导致WA....

细节!更清晰的思路,更全面的考虑!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,t;
int v[55];
int d[55][10000];
int path[55][10000];
int main()
{
    int tt;
    scanf("%d",&tt);
    for(int kase=1;kase<=tt;kase++)
    {
        scanf("%d%d",&n,&t);
        memset(path,0,sizeof(path));
        memset(d,0,sizeof(d));
        memset(v,0,sizeof(v));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&v[i]);
        }
        for(int i=n;i>=1;i--)
        {
            for(int j=0;j<=t;j++)
            {
                d[i][j]=(i==n)?0:d[i+1][j];
                path[i][j]=path[i+1][j];
                if(j>=v[i])
                {
                    if(d[i][j]<d[i+1][j-v[i]]+1)
                    {
                        path[i][j]=v[i]+path[i+1][j-v[i]];
                        d[i][j]=d[i+1][j-v[i]]+1;
                    }
                    else if(d[i][j]==d[i+1][j-v[i]]+1)
                        path[i][j]=max(path[i+1][j-v[i]]+v[i],path[i+1][j]);
                }
            }
        }
        int max_=-1;
        for(int i=t-1;i>=0;i--)
        {
            if(d[1][i]==d[1][t-1])
            {
                if(max_<path[1][i])
                    max_=path[1][i];
            }
        }
        printf("Case %d: %d %d\n",kase,d[1][t-1]+1,max_+678);
    }
    return 0;
}


你可能感兴趣的:(动态规划)