洛谷 p1064 预算

思想完全是一样的啊。。。。为毛我的炸掉

#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<map>
#include<algorithm>
using namespace std;
/*
µÚÒ»´Îʧ°ÜÔ­Òò£»
Ö»µ¥´¿±È½Ï¸÷¸ö¼þÍüÁËÖ÷¼þÖ»ÄÜ·ÅÒ»´Î 
 *****Êý¾Ý¿Ó****** 
*/
int n,m,maxn;
int f[32005];
int flag[66]; 
struct infor{
 int v;
 int p;
 int q;
 int num[3];        
}a[66];
int main()
{
    int i,j;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
      scanf("%d",&a[i].v);
      scanf("%d",&a[i].p);
      scanf("%d",&a[i].q);
      if(a[i].q!=0)
      {
            int t=a[i].q;
            a[t].num[++a[t].num[0]]=i;
      }
    }
    /*for(i=1;i<=m;i++)
    {
       printf("a[%d].q=%d,a[%d].num[0]=%d,a[%d].num[1]=%d,a[%d].num[2]=%d\n",i,a[i].q,i,a[i].num[0],i,a[i].num[1],i,a[i].num[2]);    
        
    }*/
    for(i=1;i<=m;i++)
    {
       for(j=n;j>=a[i].v;j--)
       {
            if(a[i].q==0) 
            f[j]=max(f[j],f[j-a[i].v]+a[i].v*a[i].p);
       }        
    }//ֻѡÖ÷¼þ 
    for(i=1;i<=m;i++)
    {           
        infor w=a[a[i].q];
        infor k=a[w.num[1]];
        infor e=a[w.num[2]];
       for(j=n;j>=a[i].v;j--)
       {
            if (a[i].q!=0)
            {
                
                int x=0,y=0;
                if(j-a[i].v-k.v>=0)
                {
                 x=max(f[j],f[j-a[i].v-k.v]+a[i].v*a[i].p+k.v*k.p);
                }
                if(j-a[i].v-e.v>=0)
                {
                 y=max(f[j],f[j-a[i].v-e.v]+a[i].v*a[i].p+e.v*e.p);
                }
                f[j]=max(x,y);
            }
            else
            {
                f[j]=max(f[j],f[j-a[i].v]+a[i].v*a[i].p);    
            }    
       }        
    }//Ñ¡Ö÷¼þ +Ò»¸± 
    for(i=1;i<=m;i++)
    {           
         infor w=a[a[i].q];
         infor k=a[w.num[1]];
         infor e=a[w.num[2]];
       for(j=n;j>=a[i].v-k.v-e.v;j--)
       {
            if(a[i].q!=0)
            {
                f[j]=max(f[j],f[j-a[i].v-k.v-e.v]+a[i].v*a[i].p+k.v*k.p+e.v*e.p); 
            }
            else
            {
                f[j]=max(f[j],f[j-a[i].v]+a[i].v*a[i].p);    
            }    
       }        
    }//Ñ¡Ö÷¼þ +2¸± 
    for(i=0;i<=n;i++)
    {
       
        maxn=max(maxn,f[i]);
      
    }
   printf("%d\n",maxn);

    return 0;
}
#include <iostream>
#define maxn 32005
using namespace std;
int n,m;
int v,p,q;
int main_item_w[maxn];
int main_item_c[maxn];
int annex_item_w[maxn][3];
int annex_item_c[maxn][3];
int f[maxn];
int main(){
    cin >> n >> m;
    for (int i=1;i<=m;i++){
        cin >> v >> p >> q;
        if (!q){
            main_item_w[i] = v;
            main_item_c[i] = v * p;
        }
        else{
            annex_item_w[q][0]++;
            annex_item_w[q][annex_item_w[q][0]] = v;
            annex_item_c[q][annex_item_w[q][0]] = v * p;
        }
    }

    for (int i=1;i<=m;i++)
        for (int j=n;main_item_w[i]!=0 && j>=main_item_w[i];j--){
            f[j] = max(f[j],f[j-main_item_w[i]]+main_item_c[i]);

            if (j >= main_item_w[i] + annex_item_w[i][1])
                f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][1] ] + main_item_c[i] + annex_item_c[i][1]);

            if (j >= main_item_w[i] + annex_item_w[i][2])
                f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][2] ] + main_item_c[i] + annex_item_c[i][2]);

            if (j >= main_item_w[i] + annex_item_w[i][1] + annex_item_w[i][2])
                f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][1] - annex_item_w[i][2] ] + main_item_c[i] + annex_item_c[i][1] + annex_item_c[i][2]);

         }
     cout << f[n] << endl;
     return 0;
}

 

posted @ 2017-10-03 18:44  SH,Y  阅读(234)  评论(0编辑  收藏  举报