poj 1837 Balance -- 动态规划

poj 1837 Balance -- 动态规划
#include  < iostream >
#define  MAX 22
using   namespace  std;

const   int  mm  =   8000 ;

int  dp[MAX][mm + mm];
int  arm[MAX], w[MAX];


/**/ /*
dp[i][mm+k]:取前i个时,天平处于k状态的方法数
      mm+k:    < mm为左边重, > mm 为右边重 
dp[i][mm+k] += 
            dp[i-1][mm + k-weight[i]*arm[j]], (j:1->c)};   
*/


int  main()
{
    
int c, g, i, j, k;
    
while(cin >> c >> g){
        
for(i = 0; i < c; i++)
            cin 
>> arm[i];
        
for(i = 0; i < g; i++)
            cin 
>> w[i];

        memset(dp, 
0sizeof(dp));
        
for(j = 0; j < c; j++)
            dp[
0][mm + arm[j]*w[0]] = 1;
        
for(i = 1; i < g; i++){
            
for(k = -mm; k <= mm; k++){
                
int sum = 0;
                
for(j = 0; j < c; j++)
                    
if(k - arm[j]*w[i] >= -mm && k - arm[j]*w[i] <= mm)
                    sum 
+= dp[i-1][mm + k - arm[j]*w[i]];
                dp[i][mm
+k] = sum; 
            }

        }

        cout 
<< dp[g-1][mm] << endl;
    }

return 0;
}

你可能感兴趣的:(poj 1837 Balance -- 动态规划)