描述 有N个瓷器物品排成一行,放在仓库里,小明带了一个背包去装物品,然后运送到瓷器商场,每次只能装一件,并且只能按照1到N的顺序去装物品,为了尽量防止瓷器在背包里晃来晃去的碰坏,小明总是想把背包裁剪成跟瓷器一样大小。但是不停的裁剪背包,背包会烂掉。所以限定了最多的裁减次数为K。当然如果背包比瓷器小,而裁剪次数又用完了,那么就不能再装物品了。如果背包比瓷器大,那么可以装物品,但是会浪费空间,现在要求的就是把所有物品全部运送完成后,N次装物品中总共浪费的空间最小值是多少? 输入 输入第1行两个整数N和K。 输入第2行一共N个整数,表示1到N号物品的体积ai。 输出 输出一个整数表示答案 输入样例 1 3 1 8 2 19 输出样例 1 6 输入样例 2 6 2 7 9 8 2 3 2 输出样例 2 3 提示 1≤N≤400; 1≤K<N; 0≤ai≤10^6。 样例2解释: 一开始设置背包大小为7,所以运送第1件物品时没有浪费任何空间; 然后将背包裁剪为9,运送第2件物品时没有浪费空间。; 继续运送第3件物品,这是浪费了9-8=1的空间; 然后将背包大小裁剪为3,运送第4件物品时浪费3-2=1的空间; 继续用这个背包运送第5件物品,没有浪费空间; 继续用这个背包运送第6件物品,浪费3-2=1的空间; 所以总共裁剪了2次,浪费的总空间是1+1+1=3 c++代码,不要解释,样例必须过
时间: 2024-04-17 20:28:24 浏览: 72
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N, K;
cin >> N >> K;
vector<int> items(N);
for (int i = 0; i < N; i++) {
cin >> items[i];
}
int minWaste = INT_MAX;
for (int i = 0; i <= K; i++) {
for (int j = 0; j <= K - i; j++) {
vector<int> backpack(items);
int waste = 0;
for (int k = 0; k < N; k++) {
if (backpack[k] > i) {
backpack[k] = i;
waste += backpack[k] - i;
}
}
for (int k = N - 1; k >= 0; k--) {
if (backpack[k] > j) {
backpack[k] = j;
waste += backpack[k] - j;
}
}
minWaste = min(minWaste, waste);
}
}
cout << minWaste << endl;
return 0;
}
```
阅读全文