POJ 2063 (DP)

题目:http://poj.org/problem?id=2063

 

完全背包,参考背包九讲第二讲:http://www.cnblogs.com/HpuAcmer/articles/2492595.html

 

bond看成重量,interest看成价值,本金看成背包容量。

 

注意三点:

(1)本金每年不一样,更新;

(2)本金,债券都是1000的倍数,除以1000减少循环次数,是大大减少;

(3)本金的循环是从某债券到本金递增,不能搞反了。

 

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int f[50000];

int bond[11],interest[11];
 
int main()
{
  int T,i,j,n,ans,tmp,t,start,year;
  scanf("%d",&T);
  
     do
     {
         scanf("%d%d",&start,&year);      
         scanf("%d",&n);        
         memset(f,0,sizeof(f));
         for(i = 0 ; i < n ; ++i)
         {
           scanf("%d%d",bond+i,interest+i);
           bond[i] /= 1000;
         }
          
         while(year--)
         {
           tmp = start;
           tmp /= 1000; 
            
           for(i = 0 ; i < n ; ++i)
           for(j = bond[i] ; j <= tmp ; ++j)
          // for(j = tmp ; j >= bond[i] ; --j)
           {
              t = f[j-bond[i]] + interest[i];
              if(t > f[j]) f[j] = t;  
           }
            
           start += f[tmp]; 
         }
         
         printf("%d\n",start);        
          
                 
     }while(--T);
   
  //system("pause");
  return 0;    
} 

 

 

posted @ 2012-05-09 21:46  开开甲  阅读(218)  评论(0编辑  收藏  举报