HDU3033 I love sneakers!(分组背包)
2015-09-09 10:17
459 查看
至少选一个的分组背包。
0下标外均初始化为-1。那么对于每组第j个,首先将其与本组比较,有dp[i][l] = max(dp[i][l], dp[i][l-w[j]] + v[j]),因为是初始化为-1,所以这一过程一定是必选的。
然后再与i-1组的比较,更新的才是前i组的最优值。
代码:
0下标外均初始化为-1。那么对于每组第j个,首先将其与本组比较,有dp[i][l] = max(dp[i][l], dp[i][l-w[j]] + v[j]),因为是初始化为-1,所以这一过程一定是必选的。
然后再与i-1组的比较,更新的才是前i组的最优值。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; int n,m,k,t,v[105],p[105],dp[105][10005],flag; vector<int> b[15]; int max(int a,int b,int c){ return a>b?a>c?a:c:b>c?b:c; } int main(){ freopen("/Users/apple/input.txt","r",stdin); freopen("/Users/apple/out.txt","w",stdout); while(scanf("%d%d%d",&n,&m,&k)!=EOF){ flag=0; memset(dp,-1,sizeof(dp)); for(int i=0;i<=m;i++)dp[0][i]=0; for(int i=1;i<=n;i++) { scanf("%d%d%d",&t,&p[i],&v[i]); b[t].push_back(i); } for(int i=1;i<=k;i++){ int len=b[i].size(); for(int j=0;j<len;j++){ t=b[i][j]; for(int l=m;l>=p[t];l--){ dp[i][l]=max(dp[i][l],dp[i][l-p[t]]+v[t],dp[i-1][l-p[t]]+v[t]); } } } if(dp[k][m]<0)puts("Impossible"); else printf("%d\n",dp[k][m]); } return 0; }
相关文章推荐
- Mblog 系统配置
- top里的load average怎么理解呢
- Ubuntu安装mysql和简单操作
- ajax传递json数据,springmvc后台就收json数据
- 关于正在进行耗时大的操作时候,如何进行类似于自动滚动条等提示的想法
- 大数据工具和数据分析资料汇总
- ubuntu下搭建NDK环境
- GreenDAO的简单使用
- 查看linux操作系统位数命令
- 小学语文生字表3087字(人教版)
- EL表达式
- LeetCode_contains-duplicate
- WordPress 3.9 Released – Install Using LAMP or LEMP on RHEL, CentOS & Fedora
- C# 中的委托和事件
- android下的抓包+输入密码提醒
- 前台开发框架
- 自定义Android 5.0中checkbox、RadioButton等控件
- mysql源码安装(简化版)
- ViewPager多页面滑动切换及动画效果
- Cannot find JAR 'jarjar-maven-settings-3.0.4.jar'