題意:給定兩個屬性,求這兩個屬性的和的最大值.........
思路:將第乙個屬性往後平移1000個單位,然後推導其動態轉移方程,若是dp[i],代表當加入第乙個屬性加到i時,符合題意的第二個屬性的最大值......題意是兩個屬性的和的最大值,那麼動態轉移方程必然不是dp[j]=max(dp[j],dp[j-s[i][0]]+s[i][1]),因為這個動態轉移方程固然可以求出第二個屬性的最大值,但別忘了題意要求第乙個屬性與第二個屬性的和的最大值,那麼,第乙個屬性平移了1000個單位,在考慮動態轉移時,是必須要將這個考慮進去的。可以開乙個a陣列記錄路徑,然後根據題意,
動態轉移方程應該為dp[j]=max(dp[j]-a[j]*1000,dp[j-s[i][0]]+s[i][1]-(a[j-s[i][0]]+1)*1000),一開始a陣列全部賦值為0,所以需要a[j-s[i][0]]+1.....因為它新加入了乙個值。考慮這個方程,dp陣列的初始全部賦值為負無窮大,dp[0]=0。
注意一點,在歷遍查詢最大值的時候,dp[i]>0,i-a[i]*1000>0
#include#include#includeusing namespace std;#define maxx 1000005
int s[maxx][2],dp[maxx],a[maxx];
int main()
s[i][0]+=1000;
sum+=s[i][0];
} memset(a,0,sizeof(a));
for(int i=0;i<=sum;i++)
dp[i]=-maxx;
dp[0]=0;
for(int i=1;i<=n;i++)
return 0;
}
揹包dp之01揹包
現在我們有n個配件,他們有不同的價值.但是我們揹包的容量是有限的,因為我們只有乙個一級包,所以我們最多可以裝v重量的東西.但是為了能更好的吃到雞 不存在的 我們要攜帶更有價值的配件,請問我們最多能拿多少價值的配件來當快遞員呢?輸入的第一行是t,表示有一共要打t場比賽.每組資料由三行組成.第一行包含兩...
揹包dp之01揹包變形
一種雙核cpu的兩個核能夠同時的處理任務,現在有n個已知資料量的任務需要交給cpu處理,假設已知cpu的每個核1秒可以處理1kb,每個核同時只能處理一項任務。n個任務可以按照任意順序放入cpu進行處理,現在需要設計乙個方案讓cpu處理完這批任務所需的時間最少,求這個最小的時間。輸入描述 輸入包括兩行...
DP 揹包九講之01揹包
有n件物品和乙個容量為v 的揹包。放入第i件物品耗費的空間是ci,得到 的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不 放。用子問題定義狀態 即f i,v 表示前i件物品恰放入乙個容量為v的揹包可以 獲得的最大價值。則其狀態轉移方...