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;
}
   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值