1. 程式人生 > >[IDDFS+背包] 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring

[IDDFS+背包] 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring

amp 一個點 背包dp class data- 判斷 pre 初始 eof

折騰了好幾天的題目,簡單講講心得。

  • 首先看了題解才寫出來的,因為有一個核心的一點沒想到,用桶的數量當 叠代加深搜索的層數,算是長見識了~
  • 每次dp數組的初始化自己手動賦值0,不然會TLE一個點。

思路: 以桶的數量作為深度,做IDDFS,每次用背包DP判斷當前是否可行。在一定有解的情況下,那麽這個思路是一定能求出答案的(這不是屁話嗎?

#include <cstdio>
#include <algorithm>
#include <cstring>

int q,n,bucket[105];
int v[105];
int limit;
bool dp[23333]; bool vis[122]; bool Can(){ memset(dp,0,sizeof(dp)); dp[0] = 1; for(int i=1;i<=limit;i++){ for(int j=v[i];j<=q;j++){ dp[j]+=dp[j-v[i]]; } } if(dp[q]) return true; return false; } void dfs(int pos){ if(pos > limit ){
if( Can() ){ printf("%d\n",limit); for(int i=1;i<=limit;i++) printf("%d ",v[i]); exit(0); } return; } for(int i=1;i<=n;i++){ if( !vis[i] ){ vis[i] = 1; v[pos] = bucket[i]; dfs(pos+1
); vis[i] = 0; } } } int main(){ scanf("%d",&q); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&bucket[i]); std::sort(bucket+1,bucket+1+n); for(int i=1;i<=n;i++){ limit = i; dfs(1); } return 0; }

[IDDFS+背包] 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring