2363: 【入门】码头的集装箱
内存限制:512 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:13
解决:8
题目描述
码头上停泊一艘远洋轮船,轮船可以装下 c 吨的货物,码头上有 n 个集装箱需要运走,已知第 i 个集装箱的重量为w i 。
请你编程计算,在不超出轮船最大载重量的情况下,该轮船最多可以运走多少吨的集装箱。(注意:单个集装箱不能拆开运送,对于每个集装箱来说,要么整个运到轮船上,要么不运)
请你编程计算,在不超出轮船最大载重量的情况下,该轮船最多可以运走多少吨的集装箱。(注意:单个集装箱不能拆开运送,对于每个集装箱来说,要么整个运到轮船上,要么不运)
输入
第一行有 2 个正整数 n 和 c 。n 是集装箱数,c 是轮船的载重量。
第 2 行中有 n 个正整数,表示集装箱的重量(0<n<10000,0<c<32767)。
输出
计算出的最大装载重量输出。
样例输入 复制
5 10
7 2 6 5 4
样例输出 复制
10
提示
#include<bits/stdc++.h>
using namespace std;
#define N 32770
int n,c,ai,i,j;
long long dp[N],ans=0;
int main(){
cin>>n>>c;
for(i=1;i<=n;i++){
cin>>ai;
for(j=c;j>=ai;j--){
dp[j]=max(dp[j],dp[j-ai]+ai);
}
}
cout<<dp[c];
return 0;
}
思路:dp[j]代表重量 j 是否可以凑出来。最后从 c 往下找第一个为 true 的 j 就是答案。
逻辑说明
-
dp[0]=true:重量 0 一定可以凑出来(什么都不装) - 遍历每个集装箱,倒序更新,标记哪些总重量可以凑出来
-
从最大载重 c 向下遍历,第一个
dp[j]==true,就是不超过 c 的最大可凑重量。
#include <iostream>
using namespace std;
const int MAXC = 32767;
bool dp[MAXC + 1]; // 普通一维数组
int main()
{
int n, c;
cin >> n >> c;
dp[0] = true;
// 初始化其余为false
for(int i = 1; i <= c; i++){
dp[i] = false;
}
for(int i = 1; i <= n; i++)
{
int w;
cin >> w;
// 01背包,倒序
for(int j = c; j >= w; j--)
{
if(dp[j - w])
{
dp[j] = true;
}
}
}
// 找最大可以凑出来的重量
int ans = 0;
for(int j = c; j >= 0; j--)
{
if(dp[j])
{
ans = j;
break;
}
}
cout << ans << endl;
return 0;
}