從題目描述中可以很清楚地看出這是乙個揹包問題, 並且只有兩類物品:主件和附件。所以這是乙個非樹形有依賴的揹包問題。先對每種主件的 附件的集合 進行一次 01揹包處理,就可以先求出 對於每一種主件包括其附件的組合中,每種花費的最大價值。
這樣可以得到主件k的附件中費用依次為0∼n−v[k]時的相應最大價值f[0∼n−v[k]],那麼我們就得到了主件k及其附件集合的n−v[k]+1種不同選擇情況,其中費用為v[k]+t的物品的價值就是f[t]+v[k]∗p[k]。
**:
#include#includeview code#include
#include
#include
using
namespace
std;
struct
node a[
65], p[65][65
];int
n, m;
int t[65], v[65][15], f[65][15], cnt[65], f[32005
], ans;
intmain()
}for(int i = 1; i <= m; i++)
}if(!a[i].q)
}memset(f,
0,sizeof
(f));
for(int i = 1; i <= m; i++)
for(int j = n; j >= 0; j--)
for(int k = 1; k <= cnt[i]; k++)
if(j >=v[i][k])
f[j] = max(f[j],f[j - v[i][k]] +f[i][k]);
for(int i = 0; i <= n; i++)
ans =max(ans,f[i]);
printf("%d
",ans);
return0;
}
洛谷1064 金明的預算方案
題目描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件...
金明的預算方案 洛谷 1064
題目描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件...
P1064 金明的預算方案
原題鏈結 本來是道dp題,我們拿來練搜尋了 雖然最後還是寫了dp 一開始的時候把每個情況都單獨拿出來了變成01揹包 但是有可能出現 選了主件a 選了主件a和附件a1 同時被選中的情況 這樣當然就不符合題意了呀 因為每個主件頂多只有兩個附件所以可以列舉情況直接變成分組揹包 每組裡面只能選乙個 incl...