poj 1276 Cash Machine

 

/*

多重背包问题,本题如不使用二进制分物品可能会超时,
毕竟数目不小。另一个要注意的点是不用考虑找的最少钱数,
只要能找出钱就行了,因此用0和1(dp[0]=1)赋值就行了,如
果能找到钱就赋非0值,结果输出dp值为非0的最大数就行了。

*/
#include <cstdio>

int value[100];

int dp[100010];
int main()
{
 int cash,n,count,num,val;
 while(scanf("%d",&cash)!=EOF)
 {
        count=0; 
  scanf("%d",&n);
  for ( int i=0;i<n;i++)
  {
             scanf("%d%d",&num,&val);
    int k=1;
    while (num-k>=0)
    {
     num-=k;
     value[count++]=k*val;
     k*=2;
    }
    if (num) value[count++]=num*val;
   
  }
    

  for (int i=1;i<=cash;i++)
   dp[i]=0;
  dp[0]=1;
      
  for (int i=0;i<count;i++)
    for (int v=cash;v>=value[i];v--)
     if (!dp[v])
      dp[v]=dp[v-value[i]];
     

  for (int i=cash;i>=0;i--)
   if (dp[i])
   { printf("%d/n",i); break;}
 }

  return 0;
}
   

 

你可能感兴趣的:(poj 1276 Cash Machine)