HDU——2191悼念512汶川大地震遇难同胞(多重背包转化为01背包或二进制优化)
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22442 Accepted Submission(s): 9470
为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。
请问:你用有限的资金最多能采购多少公斤粮食呢?
后记:
人生是一个充满了变数的生命过程,天灾、人祸、病痛是我们生命历程中不可预知的威胁。
月有阴晴圆缺,人有旦夕祸福,未来对于我们而言是一个未知数。那么,我们要做的就应该是珍惜现在,感恩生活——
感谢父母,他们给予我们生命,抚养我们成人;
感谢老师,他们授给我们知识,教我们做人
感谢朋友,他们让我们感受到世界的温暖;
感谢对手,他们令我们不断进取、努力。
同样,我们也要感谢痛苦与艰辛带给我们的财富~
8 2
2 100 4
4 100 2
今天很开森,做了几道DP终于稍微明白了DP的一点点套路了。多重背包可以转换成01背包,原理跟二维数组压缩成一维一样。背包问题不一定是重量和价值、空间这三个代名词,但是这三者的关系很多时候就是模版中这三者的关系,一一对应代入即可。
转化为01背包代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdlib>
- #include<sstream>
- #include<cstring>
- #include<cstdio>
- #include<string>
- #include<deque>
- #include<cmath>
- #include<queue>
- #include<set>
- #include<map>
- using namespace std;
- int c[1010];//价值因素
- int w[1010];//重量因素
- int dp[1010][1010];
- int main (void)
- {
- ios::sync_with_stdio(false);
- int t,i,j,total,kind,n,cc,ww;
- int T;
- cin>>T;
- while (T--)
- {
- memset(c,0,sizeof(c));
- memset(w,0,sizeof(w));
- memset(dp,0,sizeof(dp));
- cin>>total>>kind;
- int cnt=1;
- for (i=1; i<=kind; i++)
- {
- cin>>ww>>cc>>n;
- while (n--)
- {
- w[cnt]=ww;
- c[cnt]=cc;
- cnt++;
- }
- }
- for (i=1; i<=cnt; i++)
- {
- for (j=total; j>=0; j--)
- {
- if(j<w[i])
- {
- dp[i][j]=dp[i-1][j];//若空间不够则只能保持前面的状态
- continue;
- }
- dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);//取or不取
- }
- }
- cout<<dp[cnt-1][total]<<endl;//cnt要减一
- }
- return 0;
- }
二进制优化的原理就是不管你取的某种大米的数量是多少,我都可以用二进制表示这个数,然后每一次都取这个二进制下对应的权重,比如6,可以表示成取2+取4,若是01背包则要判断6次……显然二进制优化了很多,再比如10,取2+取8即可也是减少了很多循环判断
代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdlib>
- #include<sstream>
- #include<cstring>
- #include<bitset>
- #include<cstdio>
- #include<string>
- #include<deque>
- #include<stack>
- #include<cmath>
- #include<queue>
- #include<set>
- #include<map>
- using namespace std;
- #define INF 0x3f3f3f3f
- #define CLR(x,y) memset(x,y,sizeof(x))
- #define LC(x) (x<<1)
- #define RC(x) ((x<<1)+1)
- #define MID(x,y) ((x+y)>>1)
- typedef pair<int,int> pii;
- typedef long long LL;
- const double PI=acos(-1.0);
- const int N=110;
- int w[N],c[N],m[N];
- int dp[N];
- void cmppack(int w,int c,int V)
- {
- for (int i=c; i<=V; ++i)
- if(dp[i-c]+w>dp[i])
- dp[i]=dp[i-c]+w;
- }
- void zonepack(int w,int c,int V)
- {
- for (int i=V; i>=c; --i)
- if(dp[i-c]+w>dp[i])
- dp[i]=dp[i-c]+w;
- }
- int main(void)
- {
- int tcase,i,j,n,s;
- scanf("%d",&tcase);
- while (tcase--)
- {
- scanf("%d%d",&s,&n);
- for (i=0; i<n; ++i)
- scanf("%d%d%d",&c[i],&w[i],&m[i]);
- for (i=0; i<n; ++i)
- {
- if(c[i]*m[i]>=s)
- cmppack(w[i],c[i],s);
- else
- {
- int t=1;
- while (t<m[i])
- {
- zonepack(t*w[i],t*c[i],s);
- m[i]-=t;
- t<<=1;
- }
- zonepack(m[i]*w[i],m[i]*c[i],s);
- }
- }
- printf("%d\n",dp[s]);
- CLR(dp,0);
- }
- return 0;
- }
HDU——2191悼念512汶川大地震遇难同胞(多重背包转化为01背包或二进制优化)的更多相关文章
- HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...
- HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)
HDU 2191悼念512汶川大地震遇难同胞--珍惜如今.感恩生活(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意: 如果你有资金n元, ...
- hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)
题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 ...
- HDU 2191 悼念512汶川大地震遇难同胞
悼念512汶川大地震遇难同胞 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格 ...
- --hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
解题思路: 多重背包:第 i 件物品有 j 个可用. 本题中 第 p[i] 类大米 有 c[i] 袋大米可买 ,故本题为多重背包. n(总钱数).m(种类) p[i] 单价 h[i] 重量 c[i] ...
- 多重背包之 HDU -1171Big Event in HDU &HDU -2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
这两道题都是多重背包的基础题,前面的安格题意是:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B,就类似于NYOJ上的那个邮票分你一半那个意思,只不过这里不是一个而 ...
- hdu 2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
#include<iostream> #include<cstdio> #include<algorithm> /* 虽然该题不排序也可以过,但是我认为价格和重量最 ...
- 【多重背包】HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) ...
- 题解报告:hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
随机推荐
- 程序员的智囊库系列之2----网站框架(framework)
程序员的智囊库系列之2--网站框架(framework) 这是程序员的智囊库系列的第二篇文章.上一篇文章讲了服务器与运维相关的工具,这篇文章我们将介绍几个搭建网站的框架: django express ...
- cdoj 414 八数码 (双向bfs+康拓展开,A*)
一道关乎人生完整的问题. DBFS的优越:避免了结点膨胀太多. 假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的. 分析:起始状态结点数为1,每加深一层,结点数An ...
- Java中的ArrayList类和LinkedList
集合的体系: ----------| Collection 单列集合的根接口----------------| List 如果实现了List接口的集合类,具备的特点: 有序,可重复.--------- ...
- java基础—线程(一)
一.线程的基本概念
- 伪基站SSRP
伪基站的基本构成包括一台发射主机.一台笔记本电脑.一根天线.一部手机和电源.其中,手机用来测得频点,即某个区域运营商正规基站的频点,然后再把频点和短信内容输入到电脑安装好的程序,通过发射主机和天线进行 ...
- UIPopoverController
if (popOver == nil) { popOver = [[UIPopoverController alloc] initWithContentViewController:viewVC]; ...
- django logging日志优先级
原创博文 转载请注明出处! 参考官方文档:https://docs.djangoproject.com/en/2.1/topics/logging/ Loggers¶ A logger is the ...
- JavaScript数组之傻傻分不清系列(split,splice,slice)
因业务场景需求,需要将一个数组截断而不需要影响原数组.这里来理解一下 slice,splice,split slice() 从某个已有的数组返回选定的元素.(JavaScript Array 对象) ...
- POJ:2586-Y2K Accounting Bug
Y2K Accounting Bug Time Limit: 1000MS Memory Limit: 65536K Description Accounting for Computer Machi ...
- BFS:UVa1590-IP Networks (子网掩码相关知识)
IP Networks Alex is administrator of IP networks. His clients have a bunch of individual IP addresse ...