DP 动态规划 Problem S 1019 简单背包
2016-05-28 19:52
387 查看
Problem S ID:1019
简单题意:给出若干组设备的数目和价值,尽量使其价格平分成两部分,如果不能平分,分成的前一部分不能低于第二部分。问:分成两部分后,第一部分的价格和第二部分的价值分别是多少。
解题思路形成过程:比较简单的01背包问题,需要注意的是对输入各类设备价格和数量的操作。
在DP的两重循环中,内层循环应当是从sum/2(sum是所有设备的总价)开始。
状态转移方程式为:dp[j]=max(dp[j],dp[j-item[i]]+item[i])。
遍历结束后,第一部分的价值为:sum-dp[sum/2],第二部分的价值为:dp[sum/2]。
感想:注意输入部分的微操,注意数组大小。
代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[250001]; int item[5001]; int n,v,m,cnt,t,sum; int main() { //freopen("1.txt","r",stdin); while(scanf("%d",&n)!=EOF&&n>0) { memset(dp,0,sizeof(dp)); cnt=0; t=0; sum=0; for(int i=1;i<=n;++i) { scanf("%d%d",&v,&m); cnt+=m; while(m--) { item[t++]=v; sum+=v; } } for(int i=0;i<cnt;++i) for(int j=sum/2;j>=item[i];--j) dp[j]=max(dp[j],dp[j-item[i]]+item[i]); printf("%d %d\n",sum-dp[sum/2],dp[sum/2]); } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#使用回溯法解决背包问题实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 关于背包问题的一些理解和应用
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法