Uva 562 0-1背包
2015-12-07 15:12
239 查看
题意:给你n枚硬币,分成两份,求两份硬币之和的差最小是多少。
分析:求出总的硬币和的一半当做背包容量,然后让背包尽可能装多的硬币,这就装换成了0-1背包问题。这题刚开始没理解题意,数组开小了。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
#define maxn 50002
#define INF 0x3f3f3f3f
int n,t;
int a[maxn];
int d[maxn];
int main()
{
//freopen("f.txt","r",stdin);
cin>>t;
while(t--){
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
int bag=sum/2;
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++){
for(int j=bag;j>=a[i];j--){
// d[i][j]=((i==1)?0:d[i-1][j]);
d[j]=max(d[j],d[j-a[i]]+a[i]);
}
}
int ans;
ans=sum-2*d[bag];
printf("%d\n",ans);
}
}
分析:求出总的硬币和的一半当做背包容量,然后让背包尽可能装多的硬币,这就装换成了0-1背包问题。这题刚开始没理解题意,数组开小了。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
#define maxn 50002
#define INF 0x3f3f3f3f
int n,t;
int a[maxn];
int d[maxn];
int main()
{
//freopen("f.txt","r",stdin);
cin>>t;
while(t--){
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
int bag=sum/2;
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++){
for(int j=bag;j>=a[i];j--){
// d[i][j]=((i==1)?0:d[i-1][j]);
d[j]=max(d[j],d[j-a[i]]+a[i]);
}
}
int ans;
ans=sum-2*d[bag];
printf("%d\n",ans);
}
}
相关文章推荐
- 和日期有关的sql
- 【Solutions系列】在线关阀分析
- 基于现有图像数据创建自定义像素格式的 BufferedImage
- 36选7 java代码
- HttpUrlConnection与HttpClient的post、get的请求网络数据的方法
- 一个比较靠谱的原生js导航悬浮
- 使用dbca建库只输出:Exception in thread ”main"
- 微信红包体系设计分析
- Java JVM内存介绍与配置
- 顺序容器(四):string
- 7-RandomAccessFile 随机流
- 复制cmd里面的内容
- 音乐播放
- Android官方文档翻译 十二 3.Supporting Different Devices
- [leetcode] 89. Gray Code 解题报告
- LeetCode() Super Ugly Number
- 6-对象流(对象的序列化)
- Debian下搭建Nginx和Tomcat服务器实现负载均衡的方案
- Android popupwindow 弹出的位置问题
- mybatis在xml文件中处理大于号小于号的方法