WA 60pts

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

xhz0311 @ 2023-10-04 14:14:56

#include <bits/stdc++.h>
using namespace std;
int n,m,tv,tw,opt,c;
struct node
{
    int V,W;
    int v[6],w[6],cnt=0;
} a[32005];
int dp[32005];
int main()
{
    scanf("%d %d",&n,&m);
    while (m--)
    {
        scanf("%d %d %d",&tv,&tw,&opt);
        if (opt==0)
        {
            c++;
            a[c].V=tv;
            a[c].W=tv*tw;
        }
        else
        {
            a[opt].cnt++;
            a[opt].v[a[opt].cnt]=tv;
            a[opt].w[a[opt].cnt]=tv*tw;
        }
    }
    for (int i=1; i<=c; i++)
    {
        for (int j=n; j>=a[i].V; j--)
        {
            dp[j]=max(dp[j],dp[j-a[i].V]+a[i].W);
            if (j>=a[i].V+a[i].v[1])
            {
                dp[j]=max(dp[j],dp[j-a[i].V-a[i].v[1]]+a[i].W+a[i].w[1]);
            }
            if (j>=a[i].V+a[i].v[2])
            {
                dp[j]=max(dp[j],dp[j-a[i].V-a[i].v[2]]+a[i].W+a[i].w[2]);
            }
            if (j>=a[i].V+a[i].v[1]+a[i].v[2])
            {
                dp[j]=max(dp[j],dp[j-a[i].V-a[i].v[1]-a[i].v[2]]+a[i].W+a[i].w[1]+a[i].w[2]);
            }
        }
    }
    cout<<dp[n];
    return 0;
}

WA on #3
输入:

2000 10
500 1 0
400 4 0
300 5 1
400 5 1
200 5 0
500 4 5
400 4 0
320 2 0
410 3 0
400 3 5

正确输出

7430

我的代码输出 7200。

求调。


by _Initialize_ @ 2023-10-06 17:00:49

这个题物品数量不能单独计数,你把输入改成for循环,把a[c].V改成a[i].V,然后后面dp的时候第一层for循环m就好了


by pdxdydz @ 2023-12-07 16:20:47

这不是#2吗


|