POJ 1276 多重背包

原创 2015年11月18日 15:49:13

Cash Machine
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 30375 Accepted: 10950
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.

题意:
有几种货币,给出货币的价值和数量。从中挑一些使得总和最接近给定的数字。
解法:
多重背包裸题。

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
//dp[i]不超过i能取得的最大值
//dp[j] = max(dp[j],dp[j-v[i]]+v[i]);
int dp[100010];
int a[100000];
int v[100000];

int main(){
    int cash,n;
    while(scanf("%d%d",&cash,&n)!=EOF){
        int i,j,k;
        for(i = 1;i<=n;i++)
            scanf("%d%d",&a[i],&v[i]);

        memset(dp,0,sizeof(dp));
        for(i = 1;i<=n;i++){
            if(a[i]*v[i]>=cash){
                for(j = v[i];j<=cash;j++)
                    dp[j] = max(dp[j],dp[j - v[i]] + v[i]);
            }else{
                k = 1;
                while(k<a[i]){
                    for(j = cash;j>=k*v[i];j--){
                        dp[j] = max(dp[j],dp[j - k*v[i]] + k*v[i]);
                    }
                    a[i]-=k;
                    k<<=1;
                }
                for(j = cash;j>=a[i]*v[i];j--)
                    dp[j] = max(dp[j],dp[j - a[i]*v[i]] + a[i]*v[i]);
            }
        }
        printf("%d\n",dp[cash]);
    }
    return 0;
}

poj2392 多重背包问题

http://poj.org/problem?id=2392 Description The cows are going to space! They plan to achieve o...
  • u013573047
  • u013573047
  • 2014年11月16日 20:19
  • 1018

poj1742 多重背包的可行性问题

http://poj.org/problem?id=1742 Description People in Silverland use coins.They have coins of v...
  • u013573047
  • u013573047
  • 2015年03月18日 21:17
  • 1279

POJ 1276(多重背包)

题意: 给出现金cash 和钱币的种类n,之后对应n组钱币的数量和面值,求用这些钱币组合出的不超过cash 的最大金额。分析:多重背包:有n种物品和容量为v的背包,每种物品有num[i]个,每个物品价...
  • qq_26850187
  • qq_26850187
  • 2016年02月06日 10:31
  • 108

poj 1276 [多重背包]

Cash Machine Description A Bank plans to install a machine for cash withdrawal. The machine is abl...
  • Vectorxj
  • Vectorxj
  • 2016年05月27日 15:07
  • 357

poj 1276 多重背包

题目: Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35827   Accept...
  • xiaoli_nu
  • xiaoli_nu
  • 2017年07月09日 23:55
  • 56

POJ 1276(多重背包)

题目链接:http://poj.org/problem?id=1276 一道很有意思的题目。 做完这道题后发现了很多神奇的东西,原来多重背包问题还可以转化成完全背包问题。 另外,也更多理解了动态...
  • rachelsg
  • rachelsg
  • 2016年02月02日 12:37
  • 113

多重背包的两种求解形式

1.将多重背包转化成01背包求解。    即将物品的数量M按照二进制分解成 M = 1 + 2 + 4 + ... + 2 ^ k + a. 然后对这些物品进行01背包。    如果没有求具体方案...
  • u012139398
  • u012139398
  • 2015年02月05日 09:49
  • 608

poj 1787 多重背包记录路径

第一道记录路径的题目 Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submiss...
  • haha593572013
  • haha593572013
  • 2013年08月19日 18:49
  • 528

多重背包——POJ 1276

对应POJ题目:点击打开链接 Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Sub...
  • u013351484
  • u013351484
  • 2015年04月14日 12:05
  • 230

poj 1276 多重背包

一种优化方法思路来自于hdu2844 Coins
  • turbo_7
  • turbo_7
  • 2014年04月16日 14:26
  • 236
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1276 多重背包
举报原因:
原因补充:

(最多只允许输入30个字)