为什么60分?

P1064 [NOIP2006 提高组] 金明的预算方案

宇道人 @ 2016-07-25 21:24:35

f(i,j)表示购买第i件物品,花费为j时的最大“价格与重要度乘积和”;

f(0,j)表示花费为j时(不考虑选用了哪些物品)最大的“价格与重要度乘积和”

代码(错了6,7,8,9四个点):

#include<iostream>
#include<stdio.h>
using namespace std;
    int f[62][32010]={};
    int v[62]={},w[62]={},q[62]={};
int maxn(int a,int b)
{
    if(a>b)return a;
    else return b;
}
int main()
{
    int i=0,j=0,k=0;
    int n,m;
    cin>>n>>m;
    n=n/10;
    for(i=1;i<=m;i++)
    {
        cin>>v[i]>>w[i]>>q[i];
        w[i]=w[i]*v[i];
        v[i]=v[i]/10;
    }       //读入 
    for(i=1;i<=m;i++)if(q[i]==0 && v[i]<=n)
    {
        for(j=n;j>0;j--)if(f[0][j] && j+v[i]<=n)
        {
            for(k=1;k<i;k++)if(f[k][j])
                f[k][j+v[i]]=maxn(f[k][j+v[i]],f[k][j]+w[i]);
            f[0][j+v[i]]=maxn(f[0][j+v[i]],f[0][j]+w[i]);
            f[i][j+v[i]]=maxn(f[0][j]+w[i],f[i][j+v[i]]);
        }
        f[0][v[i]]=maxn(f[0][v[i]],w[i]);
        f[i][v[i]]=maxn(w[i],f[i][v[i]]);
    }      //计算主件 
    for(i=1;i<=m;i++)if(q[i]!=0 && v[i]<=n)
        for(j=n;j>0;j--)if(f[q[i]][j] && j+v[i]<=n)
        {
            f[0][j+v[i]]=maxn(f[0][j+v[i]],f[q[i]][j]+w[i]);
            f[q[i]][j+v[i]]=maxn(f[q[i]][j+v[i]],f[q[i]][j]+w[i]);
        }   //在主件基础上计算附件 
    int ans=0;
    for(i=1;i<=n;i++)if(ans<f[0][i])ans=f[0][i];
    cout<<ans;
    return 0;
}

by 宇道人 @ 2016-07-25 21:39:53

好吧没事了,方程推错了


|