练习三 1019
2016-05-28 15:37
267 查看
概述:题目是真的没有怎么看懂,但是可以看出这是一道基础多重背包问题。
思路:由于当时还没有怎么了解多重背包,所以直接将其转化为了01背包来做,并且二进制分解都没用,所幸数据较小,没有超时。
感想:当时只自学了01背包,,,一切以01来做。
<span style="font-size:14px;">#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[255555];
int va[500],nu[500],v[5005],w[2000];
int main()
{
int N;
while(cin>>N&&N>0)
{
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
memset(va,0,sizeof(va));
int num=0;
int k=0;
for(int i=0;i<N;i++)
{
cin>>va[i]>>nu[i];
v[k]=va[i];
k++;
num+=va[i]*nu[i];
if(nu[i]!=1)
{
for(int j=1;j<nu[i];j++)
{
v[k]=va[i];
k++;
}
}
}
for(int i=0;i<k;i++)
{
for(int j=num/2;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
cout<<num-dp[num/2]<<' '<<dp[num/2]<<endl;
}
return 0;
}</span>
思路:由于当时还没有怎么了解多重背包,所以直接将其转化为了01背包来做,并且二进制分解都没用,所幸数据较小,没有超时。
感想:当时只自学了01背包,,,一切以01来做。
<span style="font-size:14px;">#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[255555];
int va[500],nu[500],v[5005],w[2000];
int main()
{
int N;
while(cin>>N&&N>0)
{
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
memset(va,0,sizeof(va));
int num=0;
int k=0;
for(int i=0;i<N;i++)
{
cin>>va[i]>>nu[i];
v[k]=va[i];
k++;
num+=va[i]*nu[i];
if(nu[i]!=1)
{
for(int j=1;j<nu[i];j++)
{
v[k]=va[i];
k++;
}
}
}
for(int i=0;i<k;i++)
{
for(int j=num/2;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
cout<<num-dp[num/2]<<' '<<dp[num/2]<<endl;
}
return 0;
}</span>
相关文章推荐
- 24点游戏问题
- 多线程-利用thread类和runnable接口实现多线程
- Dart入门—类与方法
- Java开发必会的Linux命令
- 3NF(Third Normal Form)
- hibernate 映射文件配置默认值方法
- iOS架构师之路:慎用继承
- hibernate对象关联
- Dubbo源码学习之知识点分析
- delphi 中COPY()函数的意思
- linux,Centos,bash: service: command not found
- ios jsonModel解析数组
- leetcode 103. Binary Tree Zigzag Level Order Traversal-深度遍历|广度遍历|递归|非递归
- ViewPager+Fragment 预加载问题
- 安卓5.0学习笔记1
- 集合的理解
- 基于react-router的单页应用
- 西邮ThoughtCoding实验室2016纳新笔试题(Java部分,面向大一大二,带参考答案)
- 架构漫谈系列文章
- Android属性动画ObjectAnimator源码简单分析