裝載問題


問題描述:
有一批共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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM