关于完全背包问题

还是使用动态规划(Dynamic Planning)

问题描述:

-------------------------------------------------------------------------------------------------------------------------

背包问题

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为K,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于K,而价值的和为最大。
输入数据:
第一行两个数:物品总数N,背包载重量K;两个数用空格分隔;
第二行N个数,为N种物品重量;两个数用空格分隔;
第三行N个数,为N种物品价值; 两个数用空格分隔.
输出数据:
第一行总价值.
输入样例:
4 10
2 3 4 7
1 3 5 9
输出样例:
12

-------------------------------------------------------------------------------------------------------------------------

法一:

 1 #include "iostream"
 2 #include "cstdio"
 3 #define MAXN 8102050
 4 using namespace std;
 5 int n,w[MAXN],v[MAXN];
 6 int k;
 7 int f[MAXN];
 8 int main()
 9
10 {
11     cin>>n>>k;
12     for (int i=1;i<=k;i++)
13         f[i]=-2100000;
14     for (int i=1;i<=n;i++)
15         cin>>w[i];
16     for (int i=1;i<=n;i++)
17         cin>>v[i];
18     f[0]=0;
19     for (int i=1;i<=n;i++)
20     for (int wei=w[i];wei<=k;wei++)
21         f[wei]=(f[wei-w[i]]+v[i]>f[wei])?f[wei-w[i]]+v[i]:f[wei];
22     cout<<f[k];
23     return 0;
24 }

法二:

待续....

时间: 2024-10-28 15:02:29

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

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

有一组砝码,重量互不相等,分别为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

1616 疯狂的采药(完全背包问题)

难度:普及- 题目类型:动规 提交次数:1 涉及知识:背包动规 题目背景 此题为NOIP2005普及组第三题的疯狂版. 此题为纪念LiYuxiang而生. 题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同种类的草药,采每一种都需要一些时间,每一种也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如

背包问题

给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高. 使用动态规划算法解答 1 import java.util.Scanner; 2 3 public class 一维数组解背包问题 { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int W = sc.nextInt(), n = sc.nextInt();//W=背包容

bzoj3163: [Heoi2013]Eden的新背包问题

Description “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听.”失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她的音容笑貌. 记忆中,她总是喜欢给Eden出谜题:在 valentine’s day 的夜晚,两人在闹市中闲逛时,望着礼品店里精巧玲珑的各式玩偶,她突发奇想,问了 Eden这样的一个问题:有n个玩偶,每个玩偶有对应的价值.价钱,每个玩偶都可以被买有限次,在携带的价钱m固定的情况下,如何选择买哪些玩偶

01背包问题:POJ3624

背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题. POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案. 我们的数组基于这样一种假设: totalN表示物品的种类,totalW表示背包的容量 w[i]表示第i件物品的重量,d[i]表示第i件物品的价值. F(i,j)表示前i件物品放入容量为j的背包中,背包内物品的最大价值. F(i,j) = max{ F(i-1,j) , F(i-1,j-w[i])+d[i