ミックスバックの問題


/* 
    Name:         
    Copyright:  
    Author:      
    Date: 07-06-18 09:33 
    Description:  
       : n              c    ,   P[i] W[i]   i         。 
          (01  ),          (    ),               (    ) 
                   。 
         
   
   2  n c,    n   ,      c  
   n ,  3  Wi,Pi Ni,     i      ,       ( Ni=0,           )  
   
    ,             
 
     
3 10 
2 1 0 
3 3 1 
4 5 4 
     
11   
 
    : 
   0-1              ,                           。 
     Ni  ,                         。 
     2          ,        ,  1          。
           ,               ,
            ,       ,           ,         。   

*/  
#include  
#include  
  
using namespace std;  
  
const int MAXC = 6000; //         
const int MAXN = 2000; //       
int W[MAXN+1];//        
int P[MAXN+1];//        
int N[MAXN+1];//           
int pre[MAXC+1]; //pre[j]   B[i-1][j] 
int cur[MAXC+1]; //cur[j]   B[i][j]
int F[MAXC+1]; //       c          
int F2[MAXC+1]; //       c          
int F3[MAXC+1]; //       c          
  
int MixPack_1(int n, int c);//      :2            
int MixPack_2(int n, int c);//      :           
int MixPack_3(int n, int c);//      :          ,       ,            
int MixPack_4(int n, int c);//      :          ,           
  
int main()   
{  
    int n, c;  
    cin >> n >> c;  
      
    for (int i=1; i<=n; i++)//     0      
    {  
        cin >> W[i] >> P[i] >> N[i];  
    }  
      
    cout << MixPack_1(n, c) << endl;  
    cout << MixPack_2(n, c) << endl;  
    cout << MixPack_3(n, c) << endl; 
    cout << MixPack_4(n, c) << endl; 
      
    return 0;  
}  

int MixPack_1(int n, int c)//      :2            
{  
    for (int i=1; i<=n; i++)  
    {  
        if (N[i] == 0) //      
        {   
			//cur[j]    i       ,     j      
    		//pre[j]    i-1       ,     j      
			for (int j=1; j<=c; j++)
			{
				if (j < W[i] || pre[j] > cur[j-W[i]] + P[i])
					cur[j] = pre[j]; 
				else
					cur[j] = cur[j-W[i]] + P[i];
			}
			for (int j=1; j<=c; j++)
			{
				pre[j] = cur[j]; 
			}
        }  
        else //    (  0-1  )   
        {  
			//cur[j]    i       ,     j ,      k             
    		//pre[j]    i       ,     j ,      k-1              
            for (int k=0; k pre[j-W[i]] + P[i])
						cur[j] = pre[j]; 
					else
						cur[j] = pre[j-W[i]] + P[i];
				}
				for (int j=1; j<=c; j++)
				{
					pre[j] = cur[j]; 
				}
            }  
        }  
    }  
      
    return pre[c];  
}   
  
int MixPack_2(int n, int c)//      :1            
{  
    for (int i=1; i<=n; i++)  
    {  
        if (N[i] == 0) //      
        {   //       j     ,      j         
            for (int j=W[i]; j<=c; j++)  
            {// (j < W[i] || F[j] > F[j-W[i]] + P[i]) ,F[j]      
                if (F[j] < F[j-W[i]] + P[i])  
                    F[j] = F[j-W[i]] + P[i];  
            }  
        }  
        else //    (  0-1  )   
        {  
            for (int k=0; k=W[i]; j--)  
                {// (j < W[i] || F[j] > F[j-W[i]] + P[i]) ,F[j]      
                    if (F[j] < F[j-W[i]] + P[i])  
                        F[j] = F[j-W[i]] + P[i];  
                }  
            }  
        }  
    }  
      
    return F[c];  
}  

int MixPack_3(int n, int c)//      :          ,       ,            
{  
	int maxNum = 0; //    i     0-1        
    for (int i=1; i<=n; i++)  
    {  
		maxNum = c / W[i]; //       ,     maxNum  
        if (N[i] > 0 && maxNum > N[i]) //       
        {   
            maxNum = N[i];
        }  
        for (int k=maxNum; k>0; k--)//  i     maxNum 0-1     
        {//       j     ,      j          
            for (int j=c; j>=W[i]; j--)  
            {// (j < W[i] || F[j] > F[j-W[i]] + P[i]) ,F[j]      
                if (F2[j] < F2[j-W[i]] + P[i])  
                    F2[j] = F2[j-W[i]] + P[i];  
            }  
        }  
    }  
      
    return F2[c];  
}  

int MixPack_4(int n, int c)//      :          ,              
{  
    int s, bestP;  
    int maxNum = 0; //    i               
      
    for (int i=1; i<=n; i++)  
    {  
        for (int j=c; j>=W[i]; j--) //   0-1    ,j      
        {  
            //       ,   i    k  ,      ,       B[i][j]   
            bestP = s = 0;  
            maxNum = c / W[i]; //       ,     maxNum    
            if (N[i] > 0 && maxNum > N[i]) //           
            {       
                maxNum = N[i];    
            }    
            for (int k=maxNum; k>0; k--)  
            {  
                if (k*W[i] <= j)  
                {  
                    s = F3[j-k*W[i]] + k*P[i];   
                    if (s > bestP)  
                        bestP = s;  
                }  
            }  
            if (F3[j] < bestP) //           
                F3[j] = bestP;  
        }  
    }  
      
    return F3[c];  
}