背包问题求解总结

来源:互联网 发布:奔驰路虎宝马编程电源 编辑:程序博客网 时间:2024/04/28 10:31

 背包承重为10,价值是V的物品,重量为W,求解装的最大价值

 C=10           
i V W          
1 10 2  最优解:60       
2 20 4          
3 30 6          
4 40 5          
10到0的最大价值初始都为0         
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
0 0 0 0 0 0 0 0 0 0 0  
for (i = 1; i <= 4; i++)         
{            
    for (int c = 10; c >= c[i]; c--)        
    {            
        if(f[c - weightArray[i]] + valueArray[i] >= f[c])     
        {           
            f[c]=f[c - weightArray[i]] + valueArray[i];      
        }           
    }            
}            
 f[c - weightArray[i]] + valueArray[i]      f[c] 
i=1 weightArray[i]=2   valueArray[i]=10    
c=10 f[8] + 10 = 10     >= f[10] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 0 0 0 0 0 0 0 0 0 0  
c=9 f[7] + 10 = 10     >= f[9] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 0 0 0 0 0 0 0 0 0  
c=8 f[6] + 10 = 10     >= f[8] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 10 0 0 0 0 0 0 0 0  
c=7 f[5] + 10 = 10     >= f[7] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 10 10 0 0 0 0 0 0 0  
c=6 f[4] + 10 = 10     >= f[6] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 10 10 10 0 0 0 0 0 0  
c=5 f[3] + 10 = 10     >= f[5] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 10 10 10 10 0 0 0 0 0  
c=4 f[2] + 10 = 10     >= f[4] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 10 10 10 10 10 0 0 0 0  
c=3 f[1] + 10 = 10     >= f[3] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 10 10 10 10 10 10 0 0 0  
c=2 f[0] + 10 = 10     >= f[2] = 0   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
10 10 10 10 10 10 10 10 10 0 0  
            
            
            
i=2 weightArray[i]=4   valueArray[i]=20    
c=10 f[6] + 20 = 30     >= f[10] = 10   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
30 10 10 10 10 10 10 10 10 0 0  
c=9 f[5] + 20 = 30     >= f[9] = 10   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
30 30 10 10 10 10 10 10 10 0 0  
c=8 f[4] + 20 = 30     >= f[8] = 10   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
30 30 30 10 10 10 10 10 10 0 0  
c=7 f[3] + 20 = 30     >= f[7] = 10   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
30 30 30 30 10 10 10 10 10 0 0  
c=6 f[2] + 20 = 30     >= f[6] = 10   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
30 30 30 30 30 10 10 10 10 0 0  
c=5 f[1] + 20 = 20     >= f[5] = 10   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
30 30 30 30 30 20 10 10 10 0 0  
c=4 f[0] + 20 = 20     >= f[4] = 10   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
30 30 30 30 30 20 20 10 10 0 0  
            
            
i=3 weightArray[i]=6   valueArray[i]=30    
c=10 f[4] + 30 = 50     >= f[10] = 30   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
50 30 30 30 30 20 20 10 10 0 0  
c=9 f[3] + 30 = 40     >= f[9] = 30   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
50 40 30 30 30 20 20 10 10 0 0  
c=8 f[2] + 30 = 40     >= f[8] = 30   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
50 40 40 30 30 20 20 10 10 0 0  
c=7 f[1] + 30 = 30     >= f[7] = 30   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
50 40 40 30 30 20 20 10 10 0 0  
c=6 f[0] + 30 = 30     >= f[6] = 30   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
50 40 40 30 30 20 20 10 10 0 0  
            
            
i=4 weightArray[i]=5   valueArray[i]=40    
c=10 f[5] + 40 = 60     >= f[10] = 50   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
60 40 40 30 30 20 20 10 10 0 0  
c=9 f[4] + 40 = 60     >= f[9] = 40   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
60 60 40 30 30 20 20 10 10 0 0  
c=8 f[3] + 40 = 50     >= f[8] = 40   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
60 60 50 30 30 20 20 10 10 0 0  
c=7 f[2] + 40 = 50     >= f[7] = 30   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
60 60 50 50 30 20 20 10 10 0 0  
c=6 f[1] + 40 = 40     >= f[6] = 30   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
60 60 50 50 40 20 20 10 10 0 0  
c=5 f[0] + 40 = 40     >= f[5] = 20   
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]  
60 60 50 50 40 40 20 10 10 0 0  
   
   
   
   
   
 C=10  
i V W 
1 10 2  最优解:60
2 20 4
3 30 6
4 40 5

f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 60 50 50 40 40 20 10 10 0 0 

承重10的最大价值60

求解思路理解:  把所有的承重的最大值算出来

   f[c]=f[c - weightArray[i]] + valueArray[i];

i V W f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
1 10 2 10 10 10 10 10 10 10 10 10 0 0
2 20 4 30 30 30 30 30 20 20 10 10 0 0
3 30 6 50 40 40 30 30 40 20 10 10 0 0
4 40 5 60 60 50 50 40 40 20 10 10 0 0


为什么要使用f[c - weightArray[i]]
因为放入weightArray[i]的重量后,还剩c - weightArray[i]
c = c - weightArray[i] + weightArray[i]所能承受的最大重量
所以比较就是为了取舍
是留下f[c],还是留下剩余重量的价值f[c - weightArray[i]] + i件物品的价值valueArray[i]