问题描述:
有一批共n 个集装箱要装上艘载重量为c 的轮船,其中集装箱i 的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。
输入格式:
第一行有2 个正整数n(1<=n<=40)和c。n 是集装箱数,c 是轮船的载重量。接下来的1 个有n 个正整数,表示集装箱重量。
输出格式:
输出最大装载量
输入样例:
5 10
7 2 6 5 4
输出样例:
10
这道题就是一个01背包的简化版:价值等于重量。按01背包写,就完全可以过了。
然而我却GG了?!只过了一部分数据点。
debug了好一会,我才发现哪错了:题中只告诉了集装箱数的范围,却没告诉重量的范围,结果我的dp数组也只开了50,数据一大就过不了了……
这虽然是题不严谨,但我做题的时候也确实也应该想的周全一些。
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 typedef long long ll; 8 #define rep(i, a, n) for(int i = a; i <= n; ++i) 9 #define per(i, n, a) for(int i = n; i >= a; --i) 10 int n, m, c[50]; 11 int dp[10000]; 12 int main() 13 { 14 freopen("load.in", "r", stdin); 15 freopen("load.out", "w", stdout); 16 scanf("%d%d", &n, &m); 17 rep(i, 1, n) scanf("%d", &c[i]); 18 rep(i, 1 ,n) 19 per(j, m, c[i]) 20 dp[j] = max(dp[j], dp[j - c[i]] + c[i]); 21 printf("%d ", dp[m]); 22 return 0; 23 }