P1049 [NOIP2001 普及组] 装箱问题
复制Markdown 展开
题目描述
有一个箱子容量为 VV,同时有 nn 个物品,每个物品有一个体积。
现在从 nn 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。
输入格式
第一行共一个整数 VV,表示箱子容量。
第二行共一个整数 nn,表示物品总数。
接下来 nn 行,每行有一个正整数,表示第 ii 个物品的体积。
输出格式
- 共一行一个整数,表示箱子最小剩余空间。
输入输出样例
输入 #1复制
24 6 8 3 12 7 9 7
输出 #1复制
0
说明/提示
对于 100%100% 数据,满足 0<n≤300<n≤30,1≤V≤200001≤V≤20000。
【题目来源】
NOIP 2001 普及组第四题
代码:
C++:
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<int> cost;
int dp[10001][20001];
int main() {
int v;
cin >> v;
int n;
cin >> n;
cost.push_back(0);
for (int i = 0; i < n; i++) {
int num;
cin >> num;
cost.push_back(num);
}
for (int i = 1; i <= n; i++) {
for (int j = v; j >= 0; j--) {
if (j >= cost[i]) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cost[i]] + cost[i]);
}
else {
dp[i][j] = dp[i - 1][j];
}
}
}
cout << v - dp[n][v] << endl;
return 0;
}
Python:
dp = [[0 for i in range(10001)] for j in range(20001)]
cost = []
v = int(input())
n = int(input())
cost.append(0)
for i in range(0, n):
num = int(input())
cost.append(num)
for i in range(1, n + 1, 1):
for j in range(0, v + 1, 1):
if j >= cost[i]:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cost[i]] + cost[i])
else:
dp[i][j] = dp[i - 1][j]
print(v - dp[n][v])
JAVA:
package com.my.gududu;
import java.util.*;
public class dadada{
public static void main(String[] args) {
int dp[][] = new int[20001][20001];
int cost[] = new int[10001];
Scanner input = new Scanner(System.in);
int v = input.nextInt();
int n = input.nextInt();
cost[0] = 0;
for (int i = 1; i <= n; i++) {
int num = input.nextInt();
cost[i] = num;
}
for (int i = 1; i <= n; i++) {
for (int j = v; j >= 0; j--) {
if (j >= cost[i]) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - cost[i]] + cost[i]);
}
}
}
System.out.println(v - dp[n][v]);
}
}
C:
#include<stdio.h>
int max(int A, int B) {
return (A > B) ? A : B;
}
int cost[10001];
int dp[20001];
int main(void) {
int v;
scanf("%d", &v);
int n;
scanf("%d", &n);
cost[0] = 0;
for (int i = 1; i <= n; i++) {
int num; scanf("%d", &num);
cost[i] = num;
}
for (int i = 1; i <= n; i++) {
for (int j = v; j >= cost[i]; j--) {
dp[j] = max(dp[j], dp[j - cost[i]] + cost[i]);
}
}
printf("%d", v - dp[v]);
return 0;
}
原文地址:https://blog.csdn.net/2401_82661391/article/details/142358747
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!