dfs (當前搜到了第幾個物品,產生的總價值,剩下多少錢)
剪枝 1:如果剩下的錢數<0,直接return就好,沒必要繼續了
剪枝 2:如果所有物品都搜完了,結果記錄一下
然後vis陣列記錄這個物品的主件有沒有買,分兩種情況繼續往下搜,買該物品(前提合法)或者不買
注意沒有主件的物品我們就標記它的主件是編號為0,我們買了它
code
#include#include#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;inline
intread()
intn,m;
int v[70],w[70],q[70
];bool vis[70
];int ans=0
;void dfs(int pos,int sum,int
res)
if(res>=v[pos]&&vis[q[pos]]==1) vis[pos]=1,dfs(pos+1,sum+w[pos],res-v[pos]);
vis[pos]=0
; dfs(pos+1
,sum,res);
}int
main()
vis[
0]=1
; dfs(
1,0,n);
printf(
"%d\n
",ans);
return0;
}
這道題目比較簡單,可以轉化成分組揹包做
我們觀察每個主件只有0~2個附件
(1)對於有主件的物品來說,它可以和主件劃分為一類物品,那麼對於這一類物品,我們有4種決策,乙個也不買,只買主件,買主件和附件1,買主件和附件2,買主件和附件1和附件2,但是這4種決策是互斥的,所以可以轉化成分組揹包做【ps:可能乙個主件只有乙個附件】
(2)對於沒有主件的物品來說,它本身自成一類,和上面的分組同理
code
#include#include#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;inline
intread()
intn,m;
int v[70],w[70],q[70
];bool vis[70
];int ans=0
;void dfs(int pos,int sum,int
res)
if(res>=v[pos]&&vis[q[pos]]==1) vis[pos]=1,dfs(pos+1,sum+w[pos],res-v[pos]);
vis[pos]=0
; dfs(pos+1
,sum,res);
}int
main()
vis[
0]=1
; dfs(
1,0,n);
printf(
"%d\n
",ans);
return0;
}
洛谷P1064 金明的預算方案(有依賴的揹包問題)
金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...
洛谷 P1064 金明的預算方案 有依賴的揹包問題
洛谷 p1064 金明的預算方案 有依賴的揹包問題 include include include include include include include include include define max 100 define inf 0x3f3f3f3f typedef long lo...
洛谷 P1064 金明的預算方案 依賴揹包
金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...