如果沒有購買條件限制,這道題就是乙個01揹包。
所以我們來處理限制。
只*** dp[j - a[i].p] 最優,才能保證 dp[j] 最優,滿足無後效性。
若想使 dp[j - a[i].p] 最優,即要保證對於任意兩組值:( p1, q1, v1 、( p2, q2, v2)
假設先選擇1,若想滿足無後效性,則 j-a[2].p >= a[1].q且 j-a[1].p <= a[2].q
否則可能出現,依賴先選2計算的值取到更優的解
由此推得:a[1].q - a[1].p <= a[2].q - a[2].p
因此先對陣列a按照q-p從小到大排序,而後01揹包
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if __cplusplus >= 201103l
#include
#include
#endif
#define ll long long
using
namespace std;
const
int inf =
0x3f3f3f3f
;int dp[
5010];
struct suta[
510]
;int
cmp(sut a1,sut b)
intmain()
sort
(a+1
,a+1
+n,cmp)
;memset
(dp,0,
sizeof dp)
;for
(int i=
1;i<=n;i++)}
cout<<}return0;
}
hdu3033 加限制條件的0 1揹包
1 include stdlib.h 2 include stdio.h 3 include string h 4int n,m,k,p 101 max 0 v 101 5 intbr 11 101 sum 11 6long f 11 10001 7 8int main 18for i 1 i k ...
hdu 2546 飯卡(有小小限制的 01揹包)
problem description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功 即使購買後卡上餘額為負 否則無法購買 即使金額足夠 所以大家都希望盡量使卡上的餘額最少。某天,食堂中有n種菜 每種菜可購買一...
hdu 3466 排序01揹包
也是好題,帶限制的01揹包,先排序,再揹包 這題因為涉及到q,所以不能直接就01揹包了。因為如果乙個物品是5 9,乙個物品是5 6,對第乙個進行揹包的時候只有dp 9 dp 10 dp m 再對第二個進行揹包的時候,如果是普通的,應該會借用前面的dp 8 dp 7 之類的,但是現在這些值都是0,所以...