POJ 1276 (DP)

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

 

背包问题。

看指定的货币能组合成哪些情况。钱最多且<=cash的即是答案。

 

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a[11],type[11],m[100001];

int main()
{
   int money,num,i,j,k;
   
       while(~scanf("%d%d",&money,&num))
       {
          for(i =0 ; i < num ; ++i)
          {
                scanf("%d%d",&a[i],&type[i]);                                 
                m[type[i]] = 1;
          }
          
          memset(m,0,sizeof(m));
          m[0] = 1;
          
          for(i = 0 ; i < num ; ++i)//几种货币 
          {
              for(j = money ; j >= 0 ; --j)      
              if(m[j])
              {
                  for(k = 1; k <= a[i]; ++k)
                  {
                      if(j + k*type[i] > money) break;
                      m[j+k*type[i]] = 1; //可以得到 j+k*type[i] 
                  } 
              }      
          } 
                                       
          for(i = money ; i >= 0 ; --i)
          if(m[i])
          {                    
            printf("%d\n",i);               
            break;
          } 
       }
       
  // system("pause");
   return 0; 
}

 

posted @ 2012-05-01 16:26  开开甲  阅读(182)  评论(0编辑  收藏  举报