題意:
某物 i , 有兩種屬性值 s[i] 和 f[i] ,每件物品可取或不取,求最後s + f的最大值,同時保證s >= 0 且 f >= 0。(s 為取出的 s[i] 的總和, f為取出的 f[i] 的總和)
思路:
1、涉及到取與不取的問題,很自然地想到了揹包。
「物品的價值」這個顯而易見,但是「揹包的容量」在**?我們可以把兩個維度 t 和 s,任取乙個當作「物品的價值」,另乙個做「揹包的容量」,而容量最大值自然是這個屬性所有正數之和。
即dp[i]:當 f 屬性之和為 i 時, s 屬性之和的最大值。
2、至於負數問題, 將陣列開成最大值的兩倍即迎刃而解。
3、坑點:01揹包第二重迴圈因 f[i] 的正負不同, 迴圈方向也不同。
反思:
**:
#include
#include
#include
#include
using
namespace
std;
const
int inf = 0x3f3f3f3f;
const
int maxn = 100 + 10;
const
int maxm = 100 * 1000 * 2 + 1000;
int dp[maxm];
int n;
int f[maxn], s[maxn];
int maxf;
int solve()}}
else}}
}int maxs = 0;
bool flag = false;
for(int i = 100000; i <= maxf; i++)}}
if(flag)
return maxs;
else
return0;}
int main()
maxf += 100000;
for(int i = 0; i < maxm; i++)
printf("%d\n", solve());
}
變種的01揹包,POJ 2184
題意 這是又是一道01揹包的變體,題目要求選出一些牛,使smartness和funness值的和最大,而這些牛有些smartness或funness的值是負的,還要求最終的smartness之和以及funness之和不能為負。自己想不出來,這裡值得借鑑的就是把其中乙個東西當做費用,另乙個當做價值,這...
dp揹包之01揹包poj2184
題意 給定兩個屬性,求這兩個屬性的和的最大值.思路 將第乙個屬性往後平移1000個單位,然後推導其動態轉移方程,若是dp i 代表當加入第乙個屬性加到i時,符合題意的第二個屬性的最大值.題意是兩個屬性的和的最大值,那麼動態轉移方程必然不是dp j max dp j dp j s i 0 s i 1 ...
動態規劃 (01揹包 poj3624 )
關於揹包問題 眾所皆知,這裡講給出關於揹包問題的一些簡介 乙個旅行者準備隨身攜帶乙個揹包 可以放入揹包的物品有n 種 每種物品的重量和價值分別為 wj vj 如果揹包的最大重量限制是 b,怎樣選擇放入揹包的物品以使得揹包的價值最大?題目就是這麼簡單 先思考乙個問題 就是每種物品可以重複選擇,這種要怎...