描述
現有乙個神奇的揹包,它的容量為n,它還有個另外乙個屬性m,也是它的神奇之處,即當它的剩餘容量大於等於m時,可以裝任意乙個體積的物品,求最大能裝多少價值的物品?輸入
首先輸入n,m,t (0<=n,m,t<=1000),接下來是t行,每行兩個整數w,v(0<=w,v<=1000000)分別代表體積和價值。輸出
輸出最大能裝多少價值,測試例項輸出佔一行。樣例輸入
6 1 3樣例輸出2 33 2
2 3
8思路:
若m小於n則需要在dp[n-m]+mx_val和dp[n]之間選擇乙個最大值,即是否需要動用神奇揹包的神奇功能;那麼接下來的問題就變成了mx_val要怎麼求,首先它不能兩次使用於dp[n-m],及避免重複使用,那是否是在排除dp[n-m]所選的物品的物品中選乙個最大值?答案是否定的例如
在打表的過程中dp[n-m]的最大值為10,mx_val=3,最終為13,然而正確答案應該是18;
那該如何避免這種情況呢?這個我想了很久,後來發現只要把 拿出來就行了,所以要做兩個揹包
乙個揹包是求在所有物品中搭表來求得dp[n];另乙個則是拿去最大價值物品後來搭表求出dp[n-m];需要考慮的是最大價值的物品可能不止乙個所以需要找到價值最大且體積最大的那個物品,因為如果選了最大價值中體積小的,則原本可以被dp[n-m]選入的情況求沒了(感覺有點貪心的意思)。
**:
#include
#include
#include
using namespace std;
struct gos
;bool cmp
(gos a,gos b)
intmain()
;int n,m,t,ts=0;
gos a[
1001];
scanf
("%d%d%d"
,&n,
&m,&t)
;for
(int i=
1;i<=t;i++
)scanf
("%d%d"
,&a[i]
.w,&a[i]
.val)
;sort
(a+1
,a+t+
1,cmp)
;for
(int i=
1;i<=t;i++)if
(n>=m)
ts=dp[1]
[n-m]
+a[t]
.val;
}printf
("%d\n"
,max
(dp[0]
[n],ts));
return0;
}
若有什麼錯誤,歡迎指正^ _ ^ 。 TOJ 5743 分組揹包
描述 乙個旅行者有乙個最多能裝v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。輸入 第一行 三個整數,v 揹包容量,...
Present 神奇 揹包 最短路
先設 p1p 1 表示最小的 pp 當 pxp x 使用了 p1p 1 次時,可以用 pxp x 次 p1p 1 替代,舉個例子,假如當前選物品的情況是 i 2n p 1 1 pii 2 n p1 1 p i 此時只要在 x 2,n x 2 n 中再選出任意乙個物品 pxp x 則 p1p 1 個p...
問題 C 神奇的口袋 (揹包問題)
題目鏈結 題目描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現...