USACO 5.3 Milk Measuring(迭代深搜+DP)
2013-05-24 09:37
309 查看
像是背包的逆问题,给一个体积,然后给一些物品,求用最少的物品组成这个体积,输出字典序最小的集合。
物品和体积都不小,完全没什么思路,印象中DD大神的背包9讲里,有USACO里背包问题的解析,然后发现暴力然后DP就可以过,然后。。。就水过了。。
物品和体积都不小,完全没什么思路,印象中DD大神的背包9讲里,有USACO里背包问题的解析,然后发现暴力然后DP就可以过,然后。。。就水过了。。
/* ID: cuizhe LANG: C++ TASK: milk4 */ #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> using namespace std; int v; int p[101]; int o[101]; int que[101]; int dp[20001]; int t,n; int dfs(int x) { int i,j; if(x == 0) { for(i = 1;i <= v;i ++) dp[i] = 0; for(i = 1;i <= t;i ++) { for(j = p[que[i]];j <= v;j ++) dp[j] = max(dp[j],dp[j-p[que[i]]]+p[que[i]]); } if(dp[v] == v) return 1; else return 0; } for(i = 1;i <= n;i ++) { if(!o[i]) { o[i] = 1; que[x] = i; if(dfs(x-1)) return 1; o[i] = 0; } } return 0; } int main() { int i,j; freopen("milk4.in","r",stdin); freopen("milk4.out","w",stdout); scanf("%d%d",&v,&n); for(i = 1;i <= n;i ++) scanf("%d",&p[i]); sort(p+1,p+n+1); for(i = 1;i <= n-1;i ++) { memset(o,0,sizeof(o)); t = i; if(dfs(i)) break; } printf("%d",i); if(i == n) { for(i = 1;i <= n;i ++) printf(" %d",p[i]); } else { for(j = i;j >= 1;j --) printf(" %d",p[que[j]]); } printf("\n"); return 0; }
相关文章推荐
- USACO Section 5.3 Milk Measuring (IDDFS+dp)
- USACO Section 5.3 Milk Measuring - DFSID+DP...
- USACO 5.3 Big Barn(DP)
- [luoguP2701] [USACO5.3]巨大的牛棚Big Barn(DP)
- usaco 5.3 Big Barn(简单DP)
- [luoguP1494] 岳麓山上打水 && [luoguP2744] [USACO5.3]量取牛奶Milk Measuring
- 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring
- USACO Section 5.3 Big Barn - DP...
- USACO 5.3 Milk Measuring
- Milk Measuring_usaco 5.3_dfsid
- USACO Section 5.3 Big Barn(dp)
- Big Barn_usaco5.3_dp
- usaco 5.3 Milk Measuring(背包)
- 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)
- BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )
- bzoj 1700: [Usaco2007 Jan]Problem Solving 解题 ——dp
- bzoj 3126: [Usaco2013 Open]Photo——单调队列优化dp
- [2016/7/9][USACO1.5][dp]Superprime Rib
- USACO 1.5 Number Triangles 数字金字塔(经典dp)
- bzoj1609 [Usaco2008 Feb]Eating Together麻烦的聚餐(dp)