hdu3449(有限制条件的01背包)
2016-06-09 12:59
344 查看
链接:点击打开链接
题意:有n种物品,和w块钱,买一种物品必须先买那一种物品的购物车,问最大所获得的价值
代码:
题意:有n种物品,和w块钱,买一种物品必须先买那一种物品的购物车,问最大所获得的价值
代码:
#include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; int p[105],dp[55][100005]; struct node{ int v,w; }; vector<node> G[105]; int main(){ int n,m,i,j,k,x,y,w; while(scanf("%d%d",&n,&w)!=EOF){ memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) G[i].clear(); for(i=1;i<=n;i++){ scanf("%d",&p[i]); scanf("%d",&m); for(j=1;j<=m;j++){ scanf("%d%d",&x,&y); G[i].push_back((node){x,y}); } } //dp[i][j]表示前i个物品,容量是j获得的最大价值 memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++){ for(j=0;j<p[i];j++) dp[i][j]=-1; for(j=p[i];j<=w;j++) dp[i][j]=dp[i-1][j-p[i]]; //保证先买购物车 for(j=0;j<G[i].size();j++){ //直接在每个购物车内进行01背包 for(k=w;k>=G[i][j].v;k--) if(dp[i][k-G[i][j].v]!=-1) dp[i][k]=max(dp[i][k],dp[i][k-G[i][j].v]+G[i][j].w); } for(j=0;j<=w;j++) //和之前的值进行比较 dp[i][j]=max(dp[i][j],dp[i-1][j]); } printf("%d\n",dp [w]); } return 0; }
相关文章推荐
- CS231n 2016 通关 第六章 Training NN Part2
- LaTeX集合运算相关命令
- 第9周项目2-我的数组类
- 【HTML笔记四】认识标签三
- LaTeX输入范式
- Quartz2D使用
- display:inline-block引发的水平间隙的问题
- javascript数组详解
- Codeforces Round356 div2 680AB 679ABC
- BMP图像编码格式
- 滑动窗口的最小值问题
- GridView And highlight
- 吉林大学2011机试题——堆栈的使用
- 吉林大学2011机试题——堆栈的使用
- Oracle入门学习(3)
- VIM 操作记录
- 密码学基础
- 解决使用Spring Boot、Multipartfile上传文件路径错误问题
- 北航2009机试——字符串的查找删除
- 北航2009机试——字符串的查找删除