输出是0求条

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

Chinami_Nagisa @ 2024-10-10 21:51:14

#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
int value[65];  //价格*重要度
int cost[65];  //价格
int dp[65][32005];  //dp[i][j]表示前i个物品在总钱数不超过j的情况下value总和的最大值
int fans[65];  //附属商品的个数
int follow[65][3];//对于主商品,follow[i][1]是第一个附属商品的编号
int main()
{
    cin>>n>>m;
    int v,p,q;
    for(int i=1;i<=m;i++) 
    {
        cin>>v>>p>>q;
        cost[i]=v;
        value[i]=v*p;
        if(q!=0)  //不是主商品
            follow[q][++fans[q]]=i;
    }
    int pre=0;  //上次展开的主商品编号
    for(int i=1;i<=m;i++) 
        if(fans[i]) //如果有附属商品,即i是主商品,在展开讨论
            for(int j=0;j<=n;j++)  //主商品i,附属商品fan1,fan2
            {
                dp[i][j]=dp[pre][j];  //跳过该商品,对应01背包dp[i][j]=dp[i-1][j]
                int fan1=(fans[i]>=1)?follow[i][1]:-1;//取出两个附件编号
                int fan2=(fans[i]>=2)?follow[i][2]:-1;
                if(j-cost[i]>=0) dp[i][j]=max(dp[i][j],dp[pre][j-cost[i]]+value[i]);
                    //只要主商品
                if(fan1!=-1 && j-cost[i]-cost[fan1]>=0)  //主+fan1
                    dp[i][j]=max(dp[i][j],dp[pre][j-cost[i]-cost[fan1]]+value[i]+value[fan1]);
                if(fan2!=-1 && j-cost[i]-cost[fan2]>=0)  //主+fan2
                    dp[i][j]=max(dp[i][j],dp[pre][j-cost[i]-cost[fan2]]+value[i]+value[fan2]);
                if(fan1!=-1 && fan2!=-1 && j-cost[i]-cost[fan1]-cost[fan2]>=0)
                    dp[i][j]=max(dp[i][j],dp[pre][j-cost[i]-cost[fan1]-cost[fan2]]+value[i]+value[fan1]+value[fan2]);
                pre=i;
            }
    cout<<dp[m][n];
}

by zzz13579zzz @ 2024-10-10 22:02:17

没赋初值


by Chinami_Nagisa @ 2024-10-10 22:37:26

@zzz13579zzz 不是初值的问题吧,初值不是0吗,是 pre=i; 我写到循环里面了(


by Chinami_Nagisa @ 2024-10-10 22:41:28

@zzz13579zzz 还有应该是cout<<dp[pre][n] 但改了这些还是没过


by Chinami_Nagisa @ 2024-10-10 22:45:44

此贴结,我个纸张if条件都写错了


|