變種的01揹包,POJ 2184

2021-07-29 16:59:14 字數 997 閱讀 8147

題意:這是又是一道01揹包的變體,題目要求選出一些牛,使smartness和funness值的和最大,而這些牛有些smartness或funness的值是負的,還要求最終的smartness之和以及funness之和不能為負。

自己想不出來,這裡值得借鑑的就是把其中乙個東西當做費用,另乙個當做價值,這樣就不用開二維的陣列了,

還有就是設定shift來右移i;

照抄自:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define bug1 cout<<"bug1"<#define bug2 cout<<"bug2"<#define bug3 cout<<"bug3"namespace

std;

const

int maxn=1005;

const

int inf=1

<<30;

int s[maxn],f[maxn];

const

int maxx=200000;

int dp[maxx];

int mid=100000;

int main()

for(int i=0;i<=maxx;++i)//要注意,自己 的 0x3f3f 貌似不夠大, 所以有時候要初始為無窮大的時候要自己寫

dp[mid]=0;

for(int i=1;i<=n;++i)}}

else}}

int ans=0;

for(int i=mid;i<=maxx;++i)

}cout

<'\n';

}}

POJ2184 動態規劃 01揹包

題意 某物 i 有兩種屬性值 s i 和 f i 每件物品可取或不取,求最後s f的最大值,同時保證s 0 且 f 0。s 為取出的 s i 的總和,f為取出的 f i 的總和 思路 1 涉及到取與不取的問題,很自然地想到了揹包。物品的價值 這個顯而易見,但是 揹包的容量 在 我們可以把兩個維度 t...

dp揹包之01揹包poj2184

題意 給定兩個屬性,求這兩個屬性的和的最大值.思路 將第乙個屬性往後平移1000個單位,然後推導其動態轉移方程,若是dp i 代表當加入第乙個屬性加到i時,符合題意的第二個屬性的最大值.題意是兩個屬性的和的最大值,那麼動態轉移方程必然不是dp j max dp j dp j s i 0 s i 1 ...

0 1揹包問題的變種

最簡單的思路是,由於物品是可以無限使用的,但是揹包的容量是有限的,所以,其實每個物品可以取到的數量是有最大值的。換句話說,可以將這個可以無限使用的物品的揹包問題,轉換成乙個有限使用的物品的揹包問題,只不過此時在選取的物品列表中,很多物品是重複的。只此而已,這是乙個解決思路。更進一步,其實可以優化這個...