AIRobot

AIRobot quick note


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

装箱问题

发表于 2018-12-25 分类于 algorithm
本文字数: 649 阅读时长 ≈ 1 分钟
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
问题描述

  有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
  要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入格式

  第一行为一个整数,表示箱子容量;
  第二行为一个整数,表示有n个物品;
  接下来n行,每行一个整数表示这n个物品的各自体积。

输出格式

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

样例输入

24
6
8
3
12
7
9
7

样例输出
0

01背包

dp[j]代表j容量最多能容纳多少
状态转移方程dp[j] = max(dp[j], dp[j-vi[i]]+vi[i])
分为选和不选,取最大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<cstdio>
using namespace std;

int dp[20010];
int vi[50];
int main()
{
int n,V;
cin>>V>>n;
for(int i=0;i<n;++i)
scanf("%d", &vi[i]);
for(int i=0;i<n;++i)
{
for(int j=V;j>=vi[i]; --j)
{
dp[j] = max(dp[j], dp[j-vi[i]]+vi[i]);
}
}
cout<<V-dp[V]<<endl;
return 0;
}
求排列的逆序数
仙岛求药
AIRobot

AIRobot

AIRobot quick note
130 日志
15 分类
23 标签
GitHub E-Mail
Creative Commons
0%
© 2023 AIRobot | 716k | 10:51