洛谷P1064 金明的预算方案(DP)
2018-03-11 22:08
232 查看
题意分析
变形背包对于每种商品有5种决策
不买
买主件
买主件+1号附件
买主件+2号附件
买主件+1号和2号附件
对于5种决策分别DP即可
代码总览
#include<bits/stdc++.h> using namespace std; const int nmax = 35000; const int mmax = 100; int mainv[mmax],mainp[mmax]; int attv[mmax][3],attp[mmax][3]; int dp[nmax]; int tot,n,cnt; int main(){ while(scanf("%d %d",&tot,&n) != EOF){ cnt = 0; for(int i = 1;i<=n;++i){ int v,q,p; scanf("%d %d %d",&v,&p,&q); if(q == 0){ mainv[i] = v; mainp[i] = v*p; }else{ attv[q][0] ++; attv[q][attv[q][0]] = v; attp[q][attv[q][0]] = v * p; } } for(int i =1; i<=n;++i){ for(int j = tot;mainv[i] !=0&& j>=mainv[i];--j){ if(j>=mainv[i]) dp[j] = max(dp[j],dp[j-mainv[i]] + mainp[i]); if(j>=mainv[i] + attv[i][1]) dp[j] = max(dp[j],dp[j - mainv[i] - attv[i][1]] + mainp[i] + attp[i][1] ); if(j>=mainv[i] + attv[i][2]) dp[j] = max(dp[j],dp[j - mainv[i] - attv[i][2]] + mainp[i] + attp[i][2] ); if(j>=mainv[i] + attv[i][1] + attv[i][2]) dp[j] = max(dp[j], dp[j- mainv[i] - attv[i][1] - attv[i][2]] + mainp[i] + attp[i][1] + attp[i][2]); } } int ans = -0x3f3f3f3f; for(int i = 0;i<=tot;++i) ans = max(dp[i],ans); printf("%d\n",ans); } return 0; }
相关文章推荐
- 洛谷P1064 金明的预算方案(DP,0-1背包)
- Sicily 1346 金明的预算方案 (SOJ 1346) 【DP 动态规划-背包问题】
- WUSTOJ 1878 金明的预算方案(有依赖的背包/树形DP)
- Vijos P1313 金明的预算方案(树形DP)
- Codevs1155 金明的预算方案 ——2006年NOIP全国联赛提高组 变种经典背包dp
- 【DP】洛谷 P1064 金明的预算方案
- 洛谷P1064 金明的预算方案(01背包变形)
- 洛谷P1064 金明的预算方案
- P1064 金明的预算方案 DP
- Tyvj 1057 金明的预算方案 树形dp
- 2006年分区联赛提高组之二 金明的预算方案(dp)
- 动态规划背包问题 洛谷P1064 金明的预算方案
- [NOIP2006] 提高组 洛谷P1064 金明的预算方案
- 洛谷 1064 [NOIP2006] 金明的预算方案 背包DP
- 金明的预算方案_DP
- [动态规划] 洛谷P1064 金明的预算方案
- 金明的预算方案 (有依赖的背包/树形dp)
- ACM 背包DP [NOIP2006]金明的预算方案(budget)
- 金明的预算方案DP(写伪了)
- tyvj 1057 金明的预算方案 背包dp