POJ1384完全背包问题

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

 1 #include<stdio.h>
 2 #define inf 10000000
 3 #include<iostream>
 4 using namespace std;
 5 int main(){
 6     int n;
 7     scanf("%d",&n);
 8     while(n--){
 9         int i,empty,full,m;
10         int p[600],w[600],dp[10050];//p是价值,w是重量;
11         scanf("%d%d",&empty,&full);
12         full-=empty;
13         scanf("%d",&m);
14         for(i=0;i<m;i++)
15             scanf("%d%d",&p[i],&w[i]);
16         for(i=0;i<=full;i++)//将dp数组中的值全部变成inf;
17             dp[i]=inf;
18         dp[0]=0;
19         for(int k=0;k<m;k++)
20             for(i=0;i<=full;i++)
21                 if(i>=w[k])
22                     dp[i]=min(dp[i],dp[i-w[k]]+p[k]);//动态规划递推关系式,更新dp数组;dp[k-w[k]]表示的是增加k-w[k]重量的得到价值;
23         if(dp[full]==inf)
24             printf("This is impossible.\n");
25         else
26             printf("The minimum amount of money in the piggy-bank is %d.\n",dp[full]);
27     }
28     return 0;
29 }
时间: 2024-10-13 18:59:02

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

文章总结

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

完全背包问题 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]

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