背包问题,递归解法

来源:互联网 发布:ziperello软件下载 编辑:程序博客网 时间:2024/06/10 04:26
#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;
}
 
原创粉丝点击