谁帮帮我啊

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

我是星星 @ 2017-08-30 15:06:13

#include<iostream>
using namespace std;
int v[100],f[100][32001],k,r[100],p[100],o[100],n,m;
int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i]>>p[i]>>o[i];          //分别读入为物品i的价值,重要度,主件序号
    }
    k=n;
    for(int i=1;i<=n;i++)
      if(o[i])
        if(r[o[i]]==0)
        {
            v[++k]=v[o[i]]+v[i];p[k]=p[o[i]]+p[i];r[o[i]]=i;       //r[i]表示物件i的第一个附件的序号 
            v[i]=0;p[i]=0;                         //o[i]表示物件i的主件的序号 
        }
        else 
        {
            v[++k]=v[o[i]]+v[i]+v[r[o[i]]];p[k]=p[o[i]]+p[i]+p[r[o[i]]];
            v[++k]=v[o[i]]+v[i];p[k]=p[o[i]]+p[i];
            v[i]=0;p[i]=0;
        }
        for(int i=1;i<=k;i++)
          for(int j=m;j>=1;j--)
             if(v[i]<=j)
                f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+v[i]*p[i]); 
                  else f[i][j]=f[i-1][j];
    cout<<f[k][m];
    return 0;
}
求帮忙

by angleの奏 @ 2017-08-30 17:00:47

@2556937429lq 你的代码问题很多,还在帮你改


by 我是星星 @ 2017-08-30 17:08:47


by 我是星星 @ 2017-08-30 17:09:10

十分感谢你,谢谢


by 我是星星 @ 2017-08-30 17:15:15

#include<iostream>
#define max(x,y) ((x>y)?x:y)
using namespace std;
int dp[32005];
int n,m;
int v[65][4],s[65][4],sum[65]={0},maxn;
int main()
{
    cin>>n>>m;                     //m是物品数,n是金钱数 
    for (int i=1;i<=m;i++)
    {int V,S,k;
        cin>>V>>S>>k;              //读入每个物品的价格,重要度,主件序号     
        if(!k){                    //如果是主件的话 
            v[i][0]=V;             
            s[i][0]=S*V;           //s【i】【0】表示该物品的比价 
            sum[i]++;              //该分组的物品数加一 
        }
        else 
        {
            v[k][sum[k]]=V+v[k][0]; //在该分组下保存数据 
            s[k][sum[k]]=S*V+s[k][0];
            sum[k]++;
            if(sum[k]==3)           //如果有两个附件和一个主件了 
            {
                v[k][sum[k]]=v[k][1]+v[k][2]-v[k][0];  //将两个附件打包 
                s[k][sum[k]]=s[k][1]+s[k][2]-s[k][0];
                sum[k]++;
            }
        }
    }
    for (int i=1;i<=m;i++)           //从物品数开始循环 
    {
        if (v[i][0])                //如果有主件的话 
        for (int j=n;j>=0;j--)      //从总金钱数循环 
        {
            for (int k=0;k<sum[i];k++) //从该组的物品数量循环 
        if (v[i][k]<=j)    dp[j]=max(dp[j],dp[j-v[i][k]]+s[i][k]); //01背包问题 
        }
    }
    for (int i=0;i<=n;i++)
    maxn=max(maxn,dp[i]);   //寻找最大值 
    cout<<maxn;
}

by 我是星星 @ 2017-08-30 17:15:53

你看我这个代码适合背诵吗


by angleの奏 @ 2017-08-30 17:30:36

@2556937429lq 你该出来了??


by angleの奏 @ 2017-08-30 17:31:17

改出来了???


by 我是星星 @ 2017-08-30 17:57:51

不是我的


by 我是星星 @ 2017-08-30 18:58:18

大师,你还在该吗


上一页 |