P1064 金明的預算方案

2021-09-25 23:54:32 字數 1606 閱讀 5072

輸入

1000 5

800 2 0

400 5 1

300 5 1

400 3 0

500 2 0

輸出

2200
這道題是一道依賴揹包問題,所謂依揹包就是i依賴於j,表示若選物品i,則必須選物品j。為了簡化起見,我們先設沒有某個物品既依賴於別的物品,又被別的物品所依賴;另外,沒有某件物品同時依賴多件物品。

題目中是附件依賴與主件,並且附件沒有繼續下去的附件,所以這是一題非樹形有依賴的揹包問題。

我們首先知道,要選附件一定要選它對應的主件,所以我們首先要建立兩者的對應關係,也就是附件放到主件的陣列下:

struct nodearr[1001];

vectorpri[30222];

int dp[30222],v[60][1000],p[60][100],cnt[60];

int n,m,ans;

cin>>n>>m;

for(int i=1;i<=m;i++)

}

這樣,其實我們實現了以主件為索引的分組,然後下一步我們需要做的就是,我們可以把每組的附件進行01揹包處理,為什麼呢?我們01揹包處理的目的就是得出在購買此主件的情況下,我們如何購買附件才有最大利潤。對於每乙個附件,都是兩種情況,買和不買:

不買:dp[k]=dp[k]

買:dp[k]=dp[k-pri[i][j].v]+pri[i][j].v*pri[i][j].p

我們對於每乙個主件,都有兩種選擇,一是只選主件,二是選這個主件和它的一些附件

for(int i=1;i<=m;i++)

} }}

這邊沒有判斷是否是主件,因為如果是附件的話,他的cnt[i]就會是0,所以直接跳過了

最後,只要在dp陣列裡面尋找到最大的那個值就可以了

for(int i=0;i<=n;i++)

cout貼上總**:

#include#include#include#include#include using namespace std;

struct nodearr[1001];

vectorpri[30222];

int dp[30222],v[60][1000],p[60][100],cnt[60];

int n,m,ans;

int main()

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

}} }

for(int i=0;i<=n;i++)

cout<

system("pause");

return 0;

}

P1064 金明的預算方案

原題鏈結 本來是道dp題,我們拿來練搜尋了 雖然最後還是寫了dp 一開始的時候把每個情況都單獨拿出來了變成01揹包 但是有可能出現 選了主件a 選了主件a和附件a1 同時被選中的情況 這樣當然就不符合題意了呀 因為每個主件頂多只有兩個附件所以可以列舉情況直接變成分組揹包 每組裡面只能選乙個 incl...

P1064 金明的預算方案

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...

P1064 金明的預算方案

題目 p1064 金明的預算方案 分析 f i 表示i的錢內能得到的最大價值 g j 表示在選了某個主件下,j的錢內得到的最大價值 則狀態轉移方程為 g i max g i g i a j price a j value 其中j為i的附件 f i max f i g i ac include inc...