切换到宽版
  • 4890阅读
  • 0回复

NOIP2006金明预算,怎么会有2个不过? [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 0 发表于: 2008-04-20
2号和7号数据点不对。


#include<stdio.h>
int pay[60][3];
int zhi[60][3];
int n,money;
int dp()
{
    int max[61][3201];
    int i,j,k;
    for(i=0;i<=money;i++)
        max[0]=0;
    for(i=1;i<=n;i++)
    {
        for(j=0;j<=money;j++)
        {
            if(pay[0]>j)
            {
                max[j]=max[i-1][j];
                continue;
            }
            if(max[i-1][j-pay[0]]+zhi[0]>max[i-1][j])
                max[j]=max[i-1][j-pay[0]]+zhi[0];
            else
                max[j]=max[i-1][j];
            if(pay[0]+pay[1]<=j && max[i-1][j-pay[0]-pay[1]]+zhi[0]+zhi[1]>max[i-1][j])
                max[j]=max[i-1][j-pay[0]-pay[1]]+zhi[0]+zhi[1];
            if(pay[0]+pay[2]<=j && pay[1]<pay[2] && max[i-1][j-pay[0]-pay[2]]+zhi[0]+zhi[2]>max[i-1][j])
                max[j]=max[i-1][j-pay[0]-pay[2]]+zhi[0]+zhi[2];
            if(pay[0]+pay[1]+pay[2]<=j && max[i-1][j-pay[0]-pay[1]-pay[2]]+zhi[0]+zhi[1]+zhi[2]>max[i-1][j])
                max[j]=max[i-1][j-pay[0]-pay[1]-pay[2]]+zhi[0]+zhi[1]+zhi[2];
        }
    }
    return max[n][money];
}
int main()
{
    FILE *f;
    int i,k,num,fu,w;
    int wu[60][3];
    f=fopen("budget.in","r");
    fscanf(f,"%d %d\n",&money,&w);
    money/=10;
    for(i=1;i<=w;i++)
    {
        fscanf(f,"%d %d %d\n",&wu[0],&wu[1],&wu[2]);
        wu[0]/=10;
        wu[1]*=10;
}
    for(i=1;i<=w;i++)
        for(k=0;k<=2;k++)
        {
            pay[k]=0;
            zhi[k]=0;
        }
    fclose(f);
    n=0;
    for(i=1;i<=w;i++)
    {
        if(wu[2]!=0)
            continue;
        pay[++n][0]=wu[0];
        zhi[n][0]=wu[0]*wu[1];
        fu=0;
        for(k=1;k<=w;k++)
        {
            if(wu[k][2]==i)
            {
                fu++;
                pay[n][fu]=wu[k][0];
                zhi[n][fu]=wu[k][0]*wu[k][1];
                if(fu==2)
                  break;
            }
        }
    }
    printf("%ld\n",dp());  /*为了直观,直接输出到屏幕*/
}
快速回复
限100 字节
 
上一个 下一个