【动态规划】简单背包问题II

问题 B: 【动态规划】简单背包问题II

时间限制: 1 Sec  内存限制: 64 MB
提交: 21  解决: 14
[提交][状态][讨论版]

题目描述

张琪曼:“为什么背包一定要完全装满呢?尽可能多装不就行了吗?”

李旭琳:“你说得对,这和墨老师曾告诉我们的‘日中则昃,月满则亏’是一个道理。”所以,现在的问题是,她们有一个背包容量为v(正整数,0≤v≤20000),同时有n个魔法石(0≤n≤30),每个魔法石有一个体积 (正整数)。要求从n个魔法石中,任取若干个装入包内,使背包的剩余空间为最小。

输入

第一行为一个整数,表示背包容量,第二行为一个整数,表示有n个魔法石,接下来n行,分别表示这n个魔法石的各自体积。

输出

只有一个整数,表示背包剩余空间。

样例输入

24
6
8
3
12
7
9
7

样例输出

0代码:
 1 #include<cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 int dp[35][20005];
 8
 9 int main(){
10     int T;
11     int M;
12     int t[20005];
13     int p[20005];
14     while(scanf("%d %d",&T,&M)!=EOF){
15         for(int i=0;i<=M;i++){
16             for(int j=0;j<=T;j++){
17                 dp[i][j]=0;
18             }
19         }
20         dp[0][0]=0;
21         for(int i=1;i<=M;i++){
22             scanf("%d",&t[i]);
23         }
24         for(int i=1;i<=M;i++){
25             for(int j=1;j<=T;j++){
26                 if(j>=t[i]){
27                     dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+t[i]);
28                 }else{
29                     dp[i][j]=dp[i-1][j];
30                 }
31             }
32         }
33
34         printf("%d\n",T-dp[M][T]);
35     }
36     return 0;
37 }
 
时间: 2024-10-10 20:44:28

【动态规划】简单背包问题II的相关文章

动态规划——0-1背包问题

 0-1背包问题: 描述:给定n中物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为c,问应如何选择装入背包中的物品,使得装入背包中的物品总价值最大? 0-1背包问题是一个特殊的整数规划问题. 设所给0-1背包问题的子问题; 其最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,-,n时0-1背包问题的最优值.由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下: NO1:递归实现 1 /* 2 *Description 递归实现 3 *设有一

简单背包问题(0032)-swust oj

简单背包问题(0032) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 5657 Accepted: 1714 Accepted 搜索 动态规划 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn. 问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S. 如果有满足条件的选择,则此背包有解,否则此背包问题无解. Description 输入数据有多行,包括放入的物品重量为s,物品

动态规划:背包问题

例题:装箱问题 ( http://www.wikioi.com/problem/1014/  ) 题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入描述 一个整数v,表示箱子容量,一个整数n,表示有n个物品 接下来n个整数,分别表示这n 个物品的各自体积 输出描述 一个整数,表示箱子剩余空间. 样例输入 24 6 8 3 12 7 9 7

算法导论三剑客之 动态规划 0-1背包问题

1 #include "iostream" 2 using namespace std; 3 4 float MAX(float m1,float m2){ 5 if(m1>=m2) 6 return m1; 7 else 8 return m2; 9 } 10 11 float bag_Zero_One(int n,float v,float p[],float w[]){ 12 if(n==0||v==0) 13 return 0; 14 else{ 15 float m2;

1469:数据结构:简单背包问题

本题难点:简单背包问题递归程序的理解 简单背包问题问题定义:有一个背包重量是S,有n件物品,重量分别是W0,W1...Wn-1问能否从这n件物品中选择若干件放入背包中使其重量之和正好为S 背包问题递归版本解释:其选择只有两种可能,选择一组物品中包含Wn-1 ,此时knap(s,n)的解就是knap(s - Wn-1,n-1)的解如果选择的物品中不包括Wn-1,这样knap(s,n)的解就是knap(s,n-1)的解knap(s,n) = true, 当 s=0时knap(s,n) = false

动态规划01背包问题

动态规划0-1背包问题 ? 问题描写叙述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问应怎样选择装入背包的物品,使得装 入背包中物品的总价值最大? ? 对于一种物品,要么装入背包,要么不装.所以对于一种物品的装入状态能够取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题. 过程分析 数据:物品个数n=5,物品重量w[n]={0,2,2,6,5,4},物品价值V[n]={0,6,3,5,4,6}, (第0位,置为0,不參与计算,仅

多重背包问题II

多重背包问题II 总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i],每个小物品的价值是C[i] 求能够放入背包内的最大物品能够获得的最大价值 和上一个很类似 上一题体积就是价值,这里的价值是单独定义了 状态转移方程 不放A[i] f[i][j] =f[i-1][j] 放A[j] 可放多个设为k, k = min(j/A[i],B[i]) f[i][j] = f[i-1][j- ki*A[i]] + ki*C[i] 0<=ki<=k 取最大值 完全背包问题时候:0<=k

动态规划之背包问题

背包问题是一个经典的算法问题,可以用动态规划,贪心法,分支界限法等方法解决.问题描述:有n个物品,编号1,2,3,..n,其中第 i 个物品重量为Wi 价值 Vi ,有一个容量为W的背包.在容量允许范围内,如何选择物品,可以得到最大的价值.(为了简单起见,假设物品的重量 Wi 和价值Vi 都是正数) 今天主要说的是0.1背包问题,解法是动态规划.当然,对于另外两种问题也会有所介绍. 问题分析: 用动态规划解问题首先要有效的找出子问题,可以通过这个子问题得推得原问题的解,通常子问题的实质是和原问题

动态规划0-1背包问题

最近看了一些简单的动态规划方面的例题 在学习的过程中发现 有的问题虽然不难 但是第一次看还是会有些问题 所以把自己弄0-1背包的问题拿出来给大家分享 不喜勿喷 网上资源特别多 讲解什么的就算了 其他人画的图都不错 递推关系: 设所给0-1背包问题的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,-,n时0-1背包问题的最优值.由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式: <!--[endif]--> 上式此时背包容量为j,可选择物品为i.此时