uva10465(完全背包,要求装满背包)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=1406&mosmsg=Submission+received+with+ID+15392606

给我们两个物品的费用,和一个背包的容量

要求我们使得背包容量浪费最少的情况下,选尽可能多的物品

即要求装满背包的完全背包问题,只要注意初始化就可以了, 将dp[0]置为0, 其他的dp[i]置为-1,表示不合法

然后一个状态必须从一个合法的转移而来,然后在合法的状态转移中选取最大值

dp后,我们逆序枚举容量,找到一个合法的dp状态

那么该dp状态就是浪费容量最少的状态

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 typedef long long LL;
16 const int INF = 1<<30;
17 /*
18
19 */
20 int a[2];
21 int dp[10000 + 10];
22 int main()
23 {
24     int n, i, j;
25     while (scanf("%d%d%d", &a[0], &a[1], &n) != EOF)
26     {
27         for (i = 1; i <= n; ++i)
28             dp[i] = -1;
29         dp[0] = 0;
30         for (i = 0; i < 2; ++i)
31         for (j = a[i]; j <= n; ++j)
32         {
33             if (dp[j - a[i]] != -1)//在合法的状态转移中选取最大值
34                 dp[j] = max(dp[j], dp[j - a[i]] + 1);
35         }
36         for (j = n; j >= 1; --j)
37             if (dp[j] != -1)//找个一个合法状态
38             break;
39         if (j == n)
40             printf("%d\n", dp[j]);
41         else
42             printf("%d %d\n", dp[j], n - j);
43     }
44     return 0;
45 }

时间: 2024-11-29 08:22:14

uva10465(完全背包,要求装满背包)的相关文章

uva10465 - Homer Simpson(完全背包)

题目:10465 - Homer Simpson(完全背包) 题目大意:有个家伙很喜欢吃burger,现在有两种burger,然后给出吃这两种burger的时间,然后问你在指定的时间内,他能吃最多的burger的个数是多少.如果不能够用完的话,那么剩余时间就拿来喝水,要求喝水的时间尽量短. 解题思路:完全背包.状态转移方程:dp[t]在t时间内能吃的最多的burger数目.dp[t + v[i]] = max (dp[t + v[i]],dp[t] + 1). 代码: #include <cst

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

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

TOJ礼品兑换 (多重背包恰好装满)

近期crq老师为了提高各个学生对ACM的兴趣,在TOJ上增加了积分制度和礼品兑换功能, TOJ的积分是来之不易的,固然同学们都想用同一积分换取最大价值的礼品,某同学用了M的积分换取了一些礼品. 请问:他用M的积分最多能换取多少价值的礼品呢? (积分M一定要使用完) 输入 输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数M和N(1<=M<=1000,1<=N<=100),分别表示换取的总积分和礼品的种类,然后是N行数据,每行包含3个数p,h和c(1&l

01背包模板、全然背包 and 多重背包(模板)

转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 模版就直接贴代码: 01背包模板: /* 01背包问题 01背包问题的特点是,">每种物品仅有一件.能够选择放或不放. 01背包问题描写叙述: 有N件物品和一个容量为V的背包. 第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品

【背包问题】0-1背包、完全背包、多重背包、混合三种背包、二位费用背包、分组背包

一.0-1背包问题 输入:第一行物品的个数n,第二行背包的质量m,随后n行每行给出每个物品的重量和价值,每种物品只有一个. 输出:背包可以达到的最大价值 样例输入: 5 10 1 5 2 4 3 3 4 2 5 1 样例输出: 14 动态规划的过程中需要逆序,因为如果不是逆序那么 当i=0的时候 f[0]=0; f[1]=max(f[1],f[1-w[0]]+v[0])=5; f[2]=max(f[2],f[2-w[0]]+v[0])=10; f[3]=max(f[3],f[3-w[0]]+v[

【算法学习笔记】30.动态规划 01背包和完全背包的关系

首先先说明一下01背包和完全背包问题的区别 01背包:有 N 件物品和一个容量为 V 的背包.放入第 i 件物品耗费的费用是 Ci,得到的价值是 Wi.求解将哪些物品装入背包可使价值总和最大.(可以不装满) 完全背包:有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用.放入第 i 种物品 的费用是 Ci,价值是 Wi.求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大. 先说结论: 两个问题的最优解都要用DP来解决,实现的过程也非常像只是在内层循环中

有关货币问题的动态规划题目--有关01背包,完全背包,多重背包

背包dp:参考背包九讲以及给出一些题目 01背包 (先枚举物品,再逆序枚举容量) 给定n件物品和一个容量为V的背包,每件物品的体积是w[i],价值是va[i](1<=i<=n),求在不超过背包的容量的情况下,怎么选择装这些物品使得得到的价值最大? 例如:有5件物品,体积分别是{2,2,6,5,4},价值分别是{6,3,5,4,6} 递归式:F(i,v)=max(F(i-1,v), F(i-1,v-w[i])+va[i]),其中F(i,v)表示把前i种物品恰放入背包容量为v时取得的最大价值 把这

白话背包之全然背包

借着前面的  白话背包之01背包 的基础,来结合图看看全然背包是个什么东东,希望以后自己看能一目了然,能对刚接触的童鞋有帮助是最好只是滴 一:关于全然背包 有N个物品,每一个物品(有无限多个) i 相应有重量w[i].价值va[i].有一个背包能够放M重的物品,如今让你从N钟物品中选择一些物品,在不超过背包上限情况使得背包装的价值最大. 二:初步了解全然背包算法 那么这里看看状态转移方程: dp[i][j]=max{dp[i-1][j-k*w[i]]+k*va[i] | 0<=k*va[i]<

多重背包转换成完全背包和01背包

void CompletePack(int cost,int weight)   多重背包 { for(int i=cost;i<=m;i++) dp[i]=max(dp[i],dp[i-cost]+weight); } void ZeroOnePack(int cost,int weight)    01背包 { for(int i=m;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+weight); } void MultiplyPack(int cost,