HDU 1114 完全背包+判断能否装满

题意 给出一个存钱罐里的钱币重量 给出可能的n种钱币重量以及价值 求存钱罐中钱币的最小价值 若不可能另有输出

在裸的完全背包上加了一点东西 即判断这个背包能否被装满

初始化 dp[0]=0 其余的都使用for循环设置成INF 以达到求min的目的

最后如果dp[v]还是那么大就说明它根本没有通过前面的方式被改变 即 不能被装满

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int e,f;
int val[505];
int vol[505];
int dp[10050];
int main(){
int t;
scanf("%d",&t);
while(t--)
{
    scanf("%d%d",&e,&f);
    int v=(f-e);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&val[i],&vol[i]);
    }
    dp[0]=0;
    for(int i=1;i<=v;i++)
    {
        dp[i]=500000000;
    }
    for(int i=1;i<=n;i++)
    {
        for(int k=vol[i];k<=v;k++)
        {
            dp[k]=min(dp[k],dp[k-vol[i]]+val[i]);
        }
    }
    if(dp[v]==500000000)
    {
        printf("This is impossible.\n");
    }
    else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[v]);
}
}

  

时间: 2024-10-14 19:30:36

HDU 1114 完全背包+判断能否装满的相关文章

HDU 1114 Piggy-Bank(完全背包 DP)

题意  知道空存钱罐的重量和装满钱的存钱罐的重量及每种币值的重量   求存钱罐里至少有多少钱 裸的完全背包  但是是求最小值  所以初始0要变成初始INF  max也要变成min #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 10005, INF = 0x3f3f3f3f; int val[N], wei[N], d[N]; int ma

F - Piggy-Bank HDU 1114 (完全背包的变形+初始化细节)

F - Piggy-Bank Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1114 Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income for th

多重背包并判断能否装满(附01完全背包思想)

这是我们作业上的一道题,也是我认为挺好玩的一道题,是裸的多重背包,不过它只是单纯的让我判断能否装满.我第一次交TLE了,我以为作业题的数据不会很强,干脆偷了个懒枚举了下选的个数,没有二进制优化直接超时了,低估出题老师了~所以我又加上了二进制优化,经历一番坎坷才过. 关于这个背包的知识,我想多说一点,毕竟越是基础的东西越是要加强理解啊…… 首先,说01和完全背包,这两个都是很基础的背包,他们两个的区别在于是由当前状态转移而来还是由上一个状态转移而来,由当前状态转移而来代表可是选无数个,就是完全背包

HDU 1114 Piggy-Bank(一维背包)

题目地址:HDU 1114 把dp[0]初始化为0,其它的初始化为INF.这样就能保证最后的结果一定是满的,即一定是从0慢慢的加上来的. 代码例如以下: #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #incl

hdu 1114 Piggy-Bank

题目: 链接:点击打开链接 题意: 知道存钱罐的质量和装满硬币的存钱罐的质量,然后是不同硬币的价值和质量,求出存钱罐里钱币的最小价值. 算法: 完全背包问题,银币的个数是不限的. 思路: 状态转移方程:j = 0时,价值为0 dp[j] = min(dp[j],dp[j-w[i]]+v[i]);//表示质量为j的钱币,含有的最小的价值 代码: #include<iostream> #include<cstdio> #include<cstring> using name

hdu 1114 完全背包问题

题意:给定背包体积与物品的体积与价值 求正好放完的最小价值#include<iostream> using namespace std; int min(int a,int b) { if(a<b) return a; return b; } int main() { int t,m1,m2,n,i,j; int v[502],w[502],dp[10005],m; cin>>t; while(t--) { cin>>m1>>m2; m=m2-m1;

hdu 4381(背包变形)

题意: 给定n个块,编号从1到n,以及m个操作,初始时n个块是白色. 操作有2种形式: 1 ai xi : 从[1,ai]选xi个块,将这些块涂白. 2 ai xi:从[ai,n]选xi个块,将这些块涂白. 可以忽略某些操作且如果区间内没有足够的黑块(黑块用于涂白),则不能进行这个操作. 分析: 写写画画一看就知道这道题是一个背包问题. “恰好装满背包”. 以下摘自题解: 本题难点在于正确处理两种操作,不妨假设只有一种操作,那么这种操作如果是1的话那么就把操作按照a从小到大排序,每次都尽量往最左

[2016-03-27][HDU][1114][Piggy-Bank]

时间:2016-03-27 16:37:56 星期日 题目编号:[2016-03-27][HDU][1114][Piggy-Bank] 遇到的问题:注意f == e的情况,即dp[0] = 0; #include <cstring> #include <cstdio> #include<algorithm> using namespace std; int dp[10000 + 10]; int w[500 + 10],c[500 + 10]; int main(){

CF19B 01背包(必须装满)

http://codeforces.com/problemset/problem/19/B Bob came to a cash & carry store, put n items into his trolley, and went to the checkout counter to pay. Each item is described by its price ci and time ti in seconds that a checkout assistant spends on t