POJ 1384 Piggy-Bank【完全背包】+【恰好完全装满】

题目链接:https://vjudge.net/contest/217847#problem/A

题目大意:

  现在有n种硬币,每种硬币有特定的重量cost[i] 克和它对应的价值val[i]. 每种硬币可以无限使用. 已知现在一个储蓄罐中所有硬币的总重量正好为m克, 问你这个储蓄罐中最少有多少价值的硬币? 如果不可能存在m克的情况, 那么就输出” This is impossible.”.

解题分析:

由于每种硬币可以无限使用, 所以是明显的完全背包问题,dp[i][j]为只用前i种硬币装满j克的最小价值。注意最后对是否能够装满的判断。

#include <iostream>#include <algorithm>
using namespace std;
const int maxn = 10000 + 5;
#define INF 1e9  

int n, m;
int dp[maxn];
int weight[maxn];//每种货币重量
int val[maxn]; //每种货币价值  

int main()
{
    int T; cin>>T;
    while (T--)
    {
        int m1, m2;
        cin>>m1>>m2>>n;
        m = m2 - m1;
        for (int i = 1; i <= n; i++)
            cin >> val[i] >> weight[i];
        for (int i = 0; i <= m; i++) dp[i] = INF;
        dp[0] = 0;
        for (int i = 1; i <= n; i++)
        {
            for (int j = weight[i]; j <= m; j++)
                dp[j] = min(dp[j], dp[j - weight[i]] + val[i]);
        }
        if (dp[m] == INF) printf("This is impossible.\n");   //因为如果不能装满m克的话,也不能装满m-weight[i]克,因为那样再加上一个weight[i]克的硬币就装满m克了,所以dp[j-weight]+val=INF+val,所以此时dp[m]仍然为INF
        else printf("The minimum amount of money in the piggy-bank is %d.\n", dp[m]);
    }
    return 0;
}

2018-05-16

原文地址:https://www.cnblogs.com/00isok/p/9046432.html

时间: 2024-10-12 06:54:54

POJ 1384 Piggy-Bank【完全背包】+【恰好完全装满】的相关文章

poj 1384 Piggy-Bank(完全背包)

http://poj.org/problem?id=1384 Piggy-Bank Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7900 Accepted: 3813 Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income f

poj 1384 Piggy-Bank(全然背包)

http://poj.org/problem?id=1384 Piggy-Bank Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7900 Accepted: 3813 Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income f

poj 1384 Piggy-Bank (完全背包)

http://poj.org/problem?id=1384 题意:给出一个储蓄罐 的空和满时的重量 再给出n种硬币的 value 和 weight 问满足正好装满罐子时的最小价值是多少 思路 : if(dp[j]>dp[j-w[i]]+v[i]) dp[j]=dp[j-w[i]]+v[i]; #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include&l

POJ 1384 Piggy-Bank 背包DP

所谓的完全背包,就是说物品没有限制数量的. 怎么起个这么intimidating(吓人)的名字? 其实和一般01背包没多少区别,不过数量可以无穷大,那么就可以利用一个物品累加到总容量结尾就可以了. 本题要求装满的,故此增加个限制就可以了. #include <stdio.h> #include <stdlib.h> #include <string.h> inline int min(int a, int b) { return a < b? a : b; } c

POJ 3628 Bookshelf 2 (01背包)

Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7496   Accepted: 3451 Description Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly, and now the only available

POJ 3181 Dollar Dayz(完全背包+简单高精度加法)

POJ 3181 Dollar Dayz(完全背包+简单高精度加法) http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币分别是1美元,2美元-K美元且可以无限使用,问你用上面K种硬币构成n美元的话有多少种方法? 分析: 本题是一道明显的完全背包问题, 不过本题还可以换一种方法来看: 整数n由前K个自然数构造, 一共有多少种方法? (虽然本题要用到高精度加法, 但是很简单, 不要被吓到哦) 首先是DP部分: 令dp[i][j]==x 表示由前i种硬币构成j

poj 1276 Cash Machine (多重背包)

链接:poj 1276 题意:已知金额cash,给定几种不同面值的货币的数量及面值,求利用给定的货币可以凑成 小于等于cash的金额的最大值 分析:因为每种货币的面值及数量已知,可以将其转化为多重背包,背包的容量即为cash, 每个物品的价值及费用都为每种货币的面值. 多重背包可以转化为01背包,不过这样会超时,为了避免这样,可以转化为完全背包和二进制思想的01背包 #include<stdio.h> #include<string.h> int f[100010],v; int

POJ - 1948 二维01背包

T了两发,DP方程很简单粗暴 dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满 背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次 对于sum的枚举,其实i j枚举到sum/2就可以了 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define scan(a) scanf(

背包恰好装满和不必装满的初始化区别

背包恰好装满和不必装满的初始化区别 1.4 初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法.有的题目要求"恰好装满背包"时的最优解,有的题目则并没有要求必须把背包装满.一种区别这两种问法的实现方法是在初始化的时候有所不同. 如果是第一种问法,要求恰好装满背包,那么在初始化时除了 F [0] 为 0,其它F [1::V ] 均设为 ?1,这样就可以保证最终得到的 F [V ] 是一种恰好装满背包的最优解. 如果并没有要求必须把背包装满,而是只希望价格尽量大