P1049装箱问题

这是一道DP(背包)水题。

题目问剩余空间最小,那么意思为装得最多。拿到题后便习惯了用贪心去思考,发现局部并不是全局最优,所以考虑dp。但是发现01背包的价值呢?(这个错误的想法就显示了我对dp理解得不透彻)。而其实这些题的本源都在于写转移方程,于是便想了出来dp[j]=max(dp[j],dp[j-weight[i]]+weight[i]),用dp[j]来表示当背包容量为j时最大可以装多少。另外,要注意倒序,因为是类01。

1.不要光想套模板,要自己写出状态转移方程

2.贪心是一种方法,并不是每一个题都要用到

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 100001
using namespace std;
int dp[N];
int weight[N];
int n;
int T;
int main(){//让T最小 :装的多
    cin>>T;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>weight[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=T;j>=weight[i];j--){
            dp[j]=max(dp[j],dp[j-weight[i]]+weight[i]);
            }
    }
    cout<<T-dp[T];
    return 0;
} 

原文地址:https://www.cnblogs.com/china-mjr/p/11229182.html

时间: 2024-10-10 16:18:55

P1049装箱问题的相关文章

P1049 装箱问题

题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入输出格式 输入格式: 一个整数,表示箱子容量 一个整数,表示有n个物品 接下来n行,分别表示这n 个物品的各自体积 输出格式: 一个整数,表示箱子剩余空间. 输入输出样例 输入样例#1: 24 6 8 3 12 7 9 7 输出样例#1: 0 说明 NOIp2001普及组 第4题 比较裸的0

luogu P1049 装箱问题

题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入输出格式 输入格式: 一个整数,表示箱子容量 一个整数,表示有n个物品 接下来n行,分别表示这n 个物品的各自体积 输出格式: 一个整数,表示箱子剩余空间. 输入输出样例 输入样例#1: 24 6 8 3 12 7 9 7 输出样例#1: 0 说明 NOIp2001普及组 第4题 一道较为简

P1049 装箱问题(01背包)

题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入输出格式 输入格式: 一个整数,表示箱子容量 一个整数,表示有n个物品 接下来n行,分别表示这n 个物品的各自体积 输出格式: 一个整数,表示箱子剩余空间. 输入输出样例 输入样例#1: 复制 24 6 8 3 12 7 9 7 输出样例#1: 复制 0 说明 NOIp2001普及组 第4题

【DP复习】01背包 ovo

水题10s切得pj-的那种QAQ P1048 采药 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int sz = 1010; 5 int dp[sz], val[sz], tim[sz]; 6 int t, m; 7 int main() { 8 scanf("%d%d", &t, &m); 9 for(int i = 1; i <= m; i

P1164小A点菜

传送 这是一个典型的背包方案问题,设f[j]为当前价值为j的方案数,则f[j]=f[j]+f[j-a[i]],即当前方案数为选这个的方案数和不选这个东西的方案数,代码如下 #include<iostream> #include<cstdio> #include<cmath> using namespace std; int n,t=1,a[101],m,ans,x,y,f[5000001]; int flag[1000001]; int main() {cin>&

每日算法—04

p1049装箱问题 题目描述 有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入格式 1个整数,表示箱子容量 1个整数,表示有n个物品 接下来n行,分别表示这n个物品的各自体积 输出格式 1个整数,表示箱子剩余空间. 输入输出样例 输入 24 6 8 3 12 7 9 7 输出 0 import java.util.Scanner; public class Main

装箱问题

装箱问题 发布时间: 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("%

tyvj p1016 装箱问题

装箱问题From admin 描述 Description 有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30), 每个物品有一个体积 (正整数). 要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入格式 InputFormat第一行,一个整数,表示箱子容量:第二行,一个整数,表示有n个物品:接下来n行,分别表示这n个物品的各自体积.输出格式 OutputFormat一个整数,表示箱子剩余空间. 简单DP 01背包 #include<stdio.