背包问题,递归解法

#include < iostream.h >
#include
< string .h >

int  f[ 6 ][ 501 ][ 101 ];

int  v[ 6 =   {0,30,50,10,23,130} ;
int  w[ 6 =   {0,3,8,2,5,20} ;
int  c[ 6 =   {0,10,10,10,8,5} ;
int  t[ 6 =   {0,4,5,2,3,11} ;

const   int  maxv  =   400 ;
const   int  maxw  =   10 ;
const   int  maxn  =   5 ;

int  solve( int  n ,  int  x,  int  y)
{
    
if(f[n][x][y] >=0)
        
return f[n][x][y];
    
if( n ==0 || x ==0 || y == 0)
        f[n][x][y] 
= 0;
    
else
    
{

        
int maxi = c[n];
        
if(x / v[n]  < maxi)
            maxi 
= x / v[n];
        
if(y / w[n] < maxi )
            maxi 
= y / w[n];

        
for(int i =0 ; i <= maxi ; ++i)
        
{
            
if ((solve(n-1,x- i * v[n],y - i * w[n]) + i * t[n] ) > f[n][x][y] )
                f[n][x][y] 
= solve(n-1,x- i * v[n],y - i * w[n]) + i * t[n];
        }

    }

    
return f[n][x][y] ;
}


void  main()
{
    memset(f,
0xff,sizeof(f));

    
int ans = 0;

    
for(int x = 1 ; x <= maxv ; ++x)
        
for(int y = 1 ; y <= maxw ; ++y)
        
{
            
if( solve(5,x,y)  > ans )
                ans 
= solve(5,x,y);
        }


    cout
<<ans;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值