poj1276

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

Cash Machine

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 29827   Accepted: 10733

Description

A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount. The machine uses exactly N distinct bill denominations, say Dk, k=1,N, and for each denomination Dk the machine has a supply
of nk bills. For example,

N=3, n1=10, D1=100, n2=4, D2=50, n3=5, D3=10

means the machine has a supply of 10 bills of @100 each, 4 bills of @50 each, and 5 bills of @10 each.

Call cash the requested amount of cash the machine should deliver and write a program that computes the maximum amount of cash less than or equal to cash that can be effectively delivered according to the available bill supply of the machine.

Notes:

@ is the symbol of the currency delivered by the machine. For instance, @ may stand for dollar, euro, pound etc.

Input

The program input is from standard input. Each data set in the input stands for a particular transaction and has the format:

cash N n1 D1 n2 D2 ... nN DN

where 0 <= cash <= 100000 is the amount of cash requested, 0 <=N <= 10 is the number of bill denominations and 0 <= nk <= 1000 is the number of available bills for the Dk denomination, 1 <= Dk <= 1000, k=1,N. White spaces can occur freely between the numbers
in the input. The input data are correct.

Output

For each set of data the program prints the result to the standard output on a separate line as shown in the examples below.

Sample Input

735 3  4 125  6 5  3 350
633 4  500 30  6 100  1 5  0 1
735 0
0 3  10 100  10 50  10 10

Sample Output

735
630
0
0

Hint

The first data set designates a transaction where the amount of cash requested is @735. The machine contains 3 bill denominations: 4 bills of @125, 6 bills of @5, and 3 bills of @350. The machine can deliver the exact amount of requested cash.

In the second case the bill supply of the machine does not fit the exact amount of cash requested. The maximum cash that can be delivered is @630. Notice that there can be several possibilities to combine the bills in the machine for matching the delivered
cash.

In the third case the machine is empty and no cash is delivered. In the fourth case the amount of cash requested is @0 and, therefore, the machine delivers no cash.

Source

Southeastern Europe 2002

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
const double eps = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;

int dp[100005];
int V,n,k[1005],w[1005];

int main ()
{
    while (scanf ("%d",&V)==1)
    {
        scanf ("%d",&n);
        for (int i=1; i<=n; i++)
            scanf ("%d%d",&k[i],&w[i]);
        memset(dp, 0, sizeof(dp));
        if (!V||!n){printf ("0\n");continue;}
        int maxx=0;dp[0]=1;
        for (int i=1; i<=n; i++)
        {
            for (int j=maxx; j>=0; j--)
            {
                if (dp[j])
                {
                    for (int l=1; l<=k[i]; l++)
                    {
                        if (j+l*w[i]>V) continue;
                        dp[j+l*w[i]]=1;
                        if (maxx<j+l*w[i]) maxx=j+l*w[i];
                    }
                }
            }
        }
        printf ("%d\n",maxx);
    }
    return 0;
}

760ms暴力过的,另附上某大神二进制优化代码,76msAC。

#include<cstdio>

#include<cstring>

#define Max(a, b)   a>b?a:b

int dp[100005] ;

int val[105] ;

int main()

{

int cash, n, v, g, i, j, count ;

while(~scanf("%d%d", &cash, &n))

{

if(!cash||!n)

{

while(n--)

scanf("%d%d", &g, &v) ;

printf("0\n") ;

continue ;

}

count = 0 ;

memset(dp, 0, sizeof(dp)) ;

while(n--)

{

scanf("%d%d", &g, &v) ;

//二进制优化

i = 1 ;

while(g>=i)

{

val[count++] = i * v ;

g -= i ;

i *= 2 ;

}

if(g)   val[count++] = v * g ;

}

//01背包求解

for(i=0; i<count; i++)

{

for(j=cash; j>=val[i]; j--)

{

dp[j] = Max(dp[j], dp[j-val[i]]+val[i]) ;

}

}

printf("%d\n", dp[cash]) ;

}

return 0 ;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 02:36:43

poj1276的相关文章

poj1276——dp,多重背包

poj1276——dp,多重背包 Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28826   Accepted: 10310 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested c

POJ1276 多重背包(01背包 完全背包)

POJ1276 题目 多重背包模板题,给定背包容量\(V\),给定\(N\)种物品,每种物品的个数\(n_i\).体积\(v_i\)和重量\(w_i\)已知,求背包能装下的物品的最大重量.对应本题就是,给定提款的金额cash,给定\(N\)种钱币,每种钱币的个数为\(n_i\).面额\(D_i\)已知,求能兑换的钱币的最大值.本题中,体积和重量都等于面额. Sample Input 735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0

POJ1276:Cash Machine(多重背包)

题目:http://poj.org/problem?id=1276 多重背包模板题,没什么好说的,但是必须利用二进制的思想来求,否则会超时,二进制的思想在之前的博客了有介绍,在这里就不多说了. #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> using namespace std; int V,n,w

poj1276 多重背包

1 //Accepted 1100 KB 47 ms 2 //多重背包 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <queue> 7 #include <cmath> 8 #include <algorithm> 9 using namespace std; 10 /** 11 * This is a documentation

【POJ1276】Cash Machine

挖坑待填大神博客转载http://www.cppblog.com/MatoNo1/archive/2011/07/05/150231.aspx多重背包的单调队列初中就知道了但一直没(不会)写二进制优化初中就写过一直不写会心虚就写一下这个吧朴素方程dp[i,j]=max(dp[i-1,j-w[i]*k]+c[i]*k) w[i]*k<=j k<=j div w[i]忽略第一维dp[j]=max(dp[j-w[i]*k]+c[i]*k)复杂度O(m2n)以下是大神原文:将决策下标按照模w0的余数进

poj1276(dp)

题目链接:http://poj.org/problem?id=1276 Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29827   Accepted: 10733 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bill

POJ1276 Cash Machine

Language: Default Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27946   Accepted: 9973 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested c

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM算法总结及刷题参考

参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965)    (2)贪心(poj1328,poj2109,poj2586)    (3)递归和分治法.     (4)递推.     (5)构造法.(po