完全背包问题 POJ1384

完全背包即物品的数量不收限制,

根据01背包的思想,因为每件物品只能选1个,则要求我们不能依赖已选择物品i的选项的时候,所以需要逆序遍历

则在完全背包问题中,我们需要正序遍历。

此题时要求求出最小价值。

代码如下:

#include <stdio.h>
#include <algorithm>
using namespace std;
#define inf 10000000
#define min(a,b) a<b?a:b
int dp[11000];
int p[600];
int w[600];

int main()
{
    int i,j,k,n,e,f;
    scanf("%d",&k);
    while(k--)
    {
        scanf("%d",&e);
        scanf("%d",&f);
        int diff = f - e;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
            scanf("%d",&w[i]);
        }
        //memset(dp,inf,sizeof(dp));//不可以这样初始化
        for(int i=0;i<=diff;i++)
        {
            dp[i]=inf;
        }
        dp[0] = 0;
        for(i=1;i<=n;i++)
        {
            for(j=w[i];j<=diff;j++)
            {
                dp[j] = min(dp[j],dp[j-w[i]]+p[i]);
            }
        }
        if(dp[diff] == inf){printf("This is impossible.\n");}
        else
        {
            printf("The minimum amount of money in the piggy-bank is %d.\n",dp[diff]);
        }
    }
    system("pause");
    return 0;
}
时间: 2024-10-17 01:20:02

完全背包问题 POJ1384的相关文章

文章总结

Java集合类分析 Java集合类之ArrayList Java集合之LinkedList Java集合之HashMap Java集合之LinkedHashMap Java集合之TreeMap 基础算法 背包问题:01背包问题:POJ3624  完全背包问题 POJ1384  多重背包问题:POJ2392 二叉树:    二叉树的四种遍历的非递归实现 排序:      基础算法之快速排序  拓扑排序 POJ 2367 实现最大最小堆 查找:      基础算法之二分查找 剑指offer: 剑指o

POJ1384完全背包问题

题目大意:给你一个储蓄罐空的,和满的重量,然后给出各种硬币的价值和对应的重量,要你估计出储蓄罐里面硬币价值和最小为多少,注意要保证重量和恰好为给出满的重量解题思路:完全背包问题,只是求最小值,注意初始化的处理就可以.已知储蓄罐满时的质量f以及空时质量e,有n种硬币,每种硬币的价值为p,质量为w,求该储蓄罐中的最少有多少钱?这道题还要用到动态规划 1 #include<stdio.h> 2 #define inf 10000000 3 #include<iostream> 4 usi

poj-1384 Piggy-Bank

poj-1384 Piggy-Bank 地址:http://poj.org/problem?id=1384 题意: 知道盒子里面的物体的总重量,得到每一种硬币的价格和重量,求最少钱构成盒子物体总重量的钱的数量. 分析: 典型的不限重背包问题.当然维度也是在可以接受的范围, 直接设置dp数组进行min操作. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #

砝码问题之二(完全背包问题)

有一组砝码,重量互不相等,分别为m1.m2.m3……mn:每种砝码的数量有无限个. 现要用这些砝码去称物体的重量,给你一个重量n,请你判断有给定的砝码能否称出重量n. 现在给你一个正整数列表w和一个正整数n,列表w中的第i个元素w[i]表示第i种砝码的重量, n表示要你判断的重量.如果给定砝码能称出重量n,输出Yes,否则输出No. 例如,w=[2,5,11], n=9,则输出Yes(取两个2,一个5). w = [2, 5, 11] n = 9 S = [-1 for i in xrange(

NYOJ 106 背包问题

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10

UESTC 31 饭卡(Card) --背包问题

背包问题. 思路:如果m<5,此时也不能消费,所以此时答案为m m>=5: 求出背包容量为m-5,买前n-1样便宜的菜(排个序)的最大价值(即最大消费,即消费完后剩余值最接近5)最后减去最大的那个菜的价格,就得到最小的余额. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using n

动态规划之01背包问题(最易理解的讲解)

01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻. 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ? 题目描述: 有编号分别为a,b

0-1背包问题

[问题] 有一个贼在偷窃一家商店时发现有N件物品:第i件物品值pi元,重wi磅(1≤i≤N),且都是整数. 他希望带走的东西越值钱越好,但他的背包中最多能装下M磅的东西(整数). 如果每件物品或被带走或被留下,小偷应该带走哪几样东西? [算法解析] 令f(i,y) 表示容量为y,物品i,i+1,···,n 的优化效益值,按优化原理可列递归关系如下: 初始背包问题的递归方程 f(1,c)=max{f(2,c), f(2,c-w1)+p1} 迭代计算从f(n, *)开始((1)式)然后应用(2)式递

如何理解背包问题

问题 假定背包的最大容量为W,N件物品,每件物品都有自己的价值和重量,将物品放入背包中使得背包内物品的总价值最大.   背包问题wiki 可以想象这样一个场景--小偷在屋子里偷东西,他带着一只背包.屋子里物品数量有限--每件物品都具有一定的重量和价值--珠宝重量轻但价值高,桌 子重但价值低.最重要的是小偷背包容量有限.很明显,他不能把桌子分成两份或者带走珠宝的3/4.对于一件物品他只能选择带走或者不带走. 示例: Knapsack Max weight : W = 10 (units) Tota