NOIP2001装箱问题(codevs1014)

装箱问题

题目描述   Description    

有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。

要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入描述  Input Description    

一个整数v,表示箱子容量

一个整数n,表示有n个物品

接下来n个整数,分别表示这n 个物品的各自体积

 输出描述  Output Description     

一个整数,表示箱子剩余空间。

样例输入  Sample Input         

24

6

8

3

12

7

9

7

样例输出   Sample Output     

0

其实就是一个一维的dp。每输入一个物体a[i]就更新体积为j(a[i]≤j≤V)的背包的最大体积值即可。

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 using namespace std;
 8 int a[35];
 9 int f[20101];
10 int main()
11 {
12     int n,V;
13     scanf("%d%d",&V,&n);
14     for(int i=1;i<=n;i++)
15     {
16         scanf("%d",&a[i]);
17         for(int j=V;j>=a[i];j--) f[j]=max(f[j],f[j-a[i]]+a[i]);
18     }
19     printf("%d",V-f[V]);
20     //system("pause");
21     return 0;
22 }

codevs1014

时间: 2024-11-13 08:17:17

NOIP2001装箱问题(codevs1014)的相关文章

算法大全(c,c++)

http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):integer;beginif b=0 then gcd:=aelse gcd:=gcd (b,a mod b);end ; 2.求两数的最小公倍数function lcm(a,b:integer):integer;beginif a<b then swap(a,b);lcm:=a;while lcm

分享给某人的前端面试题库(二)-算法

基本算法(pascal) 1.数论算法 求两数的最大公约数 function gcd(a,b:integer):integer; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod B); end; 求两数的最小公倍数 function lcm(a,b:integer):integer; begin if a< b then swap(a,B); lcm:=a; while lcm mod b >0 do inc(lcm,a); end; 素数的求法

常见算法用Pascal实现

基本算法    这些都是非常基本的的算法,希望所有学习的人都能理解!        1.数论算法      求两数的最大公约数      function gcd(a,b:integer):integer;      begin      if b=0 then gcd:=a      else gcd:=gcd (b,a mod b);      end ;           求两数的最小公倍数      function lcm(a,b:integer):integer;      beg

NOIP2001 普及组 装箱问题

标准的01背包,就不写分析了,标准就看 我的背包问题的解析 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 /* * ===================================================================================== * *

【日常学习】【背包DP】codevs1014 装箱问题题解

转载请注明出处 来自CSDN用户ametake 题目来自NOIP2011PJ4 上题目 题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入描述 Input Description 一个整数v,表示箱子容量 一个整数n,表示有n个物品 接下来n个整数,分别表示这n 个物品的各自体积 输出描述 Output Descr

【dp】装箱问题

装箱问题                         (pack.pas/c/cpp) 来源:NOIP2001(普及组) 第四题 [问题描述] 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30=,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. [输入文件] 第一 行一个正整数V表示箱子的容量,第二行一个正整数N表示物品个数,接下来N行列出这N个物品各自的体积. [输出文件] 单独一行,表示箱子最小

NOIP2001普及组解题报告

数的计算 分析:递归即可.不用学他造数. #include<iostream> #include<algorithm> using namespace std; int f(int n){ int ret=1; for(int i=1;i<=n/2;++i){ ret+=f(i); } return ret; } int main(){ int n; cin>>n; cout<<f(n); return 0; } 求先序排列 分析:将中序排列分为l到r

装箱问题

装箱问题 发布时间: 2017年8月15日 23:23   最后更新: 2017年8月15日 23:25   时间限制: 1000ms   内存限制: 128M 描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入 一个整数,表示箱子容量 一个整数,表示有n个物品 接下来n行,分别表示这n 个物品的各自体积 输出 一个整数,表示箱子剩余空间. 样

装箱问题(0-1背包)

有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi.找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船. #include <iostream> #define MAX 12882 using namespace std; struct node { int w; }data[MAX]; int dp[MAX],n,m; void Init() { int i; for(i=1;i<=n;i++) scanf("%