問題描述:
有一批共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\n", dp[m]); 22 return 0; 23 }