這是乙個揹包型別的問題,但是存在附件這個問題,因為要拿附件就一定要拿主件,而且附件最多只有2種,假設有2種附件,那麼這個物品就有三種狀態
第一種就是只拿主鍵,dp[j] = max(dp[j], dp[j-now[i].v] + now[i].v*now[i].p);
第二種就是那主鍵和第乙個附件 dp[j] = max(dp[j], dp[j-now[i].v-vec[i][0].v] + now[i].v*now[i].p+vec[i][0].v*vec[i][0].p);
第三種就是拿主鍵和第二個附件,基本同上。
第四種就是拿主鍵和兩個附件,dp[j] = max(dp[j], dp[j-now[i].v-vec[i][0].v-vec[i][1].v]+now[i].v*now[i].p+vec[i][1].v*vec[i][1].p+vec[i][0].v*vec[i][0].p);
然後按照揹包問題的轉移方式做就可以了,滾動一下優化空間,**如下。
#include using namespace std;
const int maxn = 1e2 + 10;
int dp[maxn*1000],v[maxn][4],val[maxn],q[maxn],a[maxn];
struct node now[maxn];
vectorvec[maxn];
int main()
}for (int i=1; i<=m; i++) }}
cout << dp[n] << endl;
return 0;
洛谷 P1064 金明的預算方案
題目描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件...
洛谷 P1064 金明的預算方案
題目描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件...
P1064 金明的預算方案(洛谷)
思路 因為每個主件最多只有兩個附件,所以列舉每個主件如果滿足條件的話可以分為五種情況購買 什麼都不買 只買主件 買主件和第乙個附件 買主件和第二個附件 買主件和兩個附件。然後分別計算出每種情況的物品 與重要度乘積之和,最後取最大值即可.include using namespace std int ...