POJ 1276 Cash Machine

来源:互联网 发布:数据清洗包括什么 编辑:程序博客网 时间:2024/06/05 15:23

题目大意:给你一个最大金额和一些纸币让你从这些纸币中挑选任意张,问不超过最大金额的总金额(所有纸币面额之和)


思路:不断枚举各种纸币,记录符合条件的总金额情况,更新最大值。


代码如下:

#include<stdio.h>#include<string.h> int dp[100100], num[1001000], v[100100]; // dp[] 记录总钱数的情况  eg:  dp[i]==1  总钱数为i成立, dp[i]==0 总钱数为i不成立 // num[] 记录各种面额纸币的数量// v[] 记录各种纸币的面额 int main(){ int answer, n, i, j; while(scanf("%d %d",&answer,&n) != EOF) // answer 你最大可以挑选纸币的总值, n 纸币的种类     {        for(i=1;i<=n;i++)          scanf("%d %d",&num[i],&v[i]); // 输入各种纸币的数量 面额           if(answer==0||n==0) // 如果最大可以挑选纸币的总值为0 结果肯定是0  {  printf("0\n"); continue;  }int tem;memset(dp,0,sizeof(dp));  dp[0] = 1;  // 初始总额为0 成立 int max = 0; // 可以达到的总金额,初始为0    for(i=1;i<=n;i++) // 枚举各个钱币           {           for(j=max;j>=0;j--) // 枚举已经成立的总金额(max 是现在可以达到的最大总金额)             {                 if(dp[j] == 1)    {      for(int k=1;k<=num[i];k++) // 加上当前的纸币   {     tem = j+k*v[i];     if(tem>answer)      continue;     dp[tem] = 1;     if(tem>max)      max = tem; // 更新总金额   } }  }    }    printf("%d\n",max); }   return 0;}


原创粉丝点击