20pts求调(写的分组背包

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

Yaco_Naomi_Jane @ 2024-08-16 15:18:07

//
#include<bits/stdc++.h>
using namespace std;
int k, pp, cnt;
int V[65], P[65], Q[65];
int r[65][3], v[65][5], p[65][5];
int f[32000];
int main()
{
    int n, m;
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>V[i]>>pp>>Q[i];
        P[i]=V[i]*pp;
        if(Q[i]!=0)
        {
            k=1;
            while(r[Q[i]][k]!=0)    k++;
            r[Q[i]][k]=i;
        }
    }
    for(int i=1; i<=m; i++)
    {
        if(Q[i]==0)
        {
            v[cnt][1]=V[i]; p[cnt][1]=P[i];
            v[cnt][2]=V[i]+V[r[i][1]]; p[cnt][2]=P[i]+P[r[i][1]];
            v[cnt][3]=V[i]+V[r[i][2]]; p[cnt][3]=P[i]+P[r[i][2]];
            v[cnt][4]=V[i]+V[r[i][2]]+V[r[i][1]]; p[cnt][4]=P[i]+P[r[i][2]]+V[r[i][1]];
            cnt++;
        }
    }
    for(int i=1; i<cnt; i++)
        for(int j=n; j>=1; j--)
        {
            f[j]=f[j-1];
            if(j>=v[i][1])
                f[j]=max(f[j], f[j-v[i][1]]+p[i][1]);
            if(j>=v[i][2])
                f[j]=max(f[j], f[j-v[i][2]]+p[i][2]);       
            if(j>=v[i][3])
                f[j]=max(f[j], f[j-v[i][3]]+p[i][3]);
            if(j>=v[i][4])
                f[j]=max(f[j], f[j-v[i][4]]+p[i][4]);
        }
    cout<<f[n];
    return 0;
 } 

by liheyang123 @ 2024-08-18 17:15:13

说说我的看法

你所写的背包只有上一次更新的状态(上一次更新可能与这一次更新在同一组中),然而你应该写的状态变化应该是由上一组更新后的状态更新,因此你应该新建一个数组用来存放上一次更新的状态


by liheyang123 @ 2024-08-18 17:16:45

抱歉,打错了。

应该是新建一个数组用来存放上一组更新后的状态

@Yaco_Naomi_Jane


|