简单背包问题
来源:互联网 发布:中世纪2优化9兵种 编辑:程序博客网 时间:2024/06/05 10:07
出自算法引论-一种创造性方法
1、背包问题:
给定一个整数K和N个大小不同的物品,第i个物品的体积为S[i],寻找一个子集使子集的和大小等于K,或者确定不存在这样的子集
解答:
动态规划,即建立P[n][k](0<=n<=N,0<=k<=K)大小二维数组保存解,根据前面的解P[n-1][k],P[n-1][K-S[n]]的状态来确定。
代码:
const int N =6;//物品数量
int S[N+1] = {0,3,5,6,8,2,4};//物品体积,S[0]无效
const int K =14;//背包大小
typedef struct _state{
int exist;//是否存在解
int belong;//是否包含当前S[n]
}state;
state P[N+1][K+1];
int knapsack()
{
P[0][0].exist = 1;
std::cout<<" 0 ";
for (int k =1; k <= K; k++){
P[0][k].exist =0;
std::cout<<k<<" ";
}
std::cout<<std::endl;
for (int i =1; i <= N; i++){
std::cout<<S[i]<<" ";
for (int k =0; k <=K;k++){
P[i][k].exist =0;
if (P[i-1][k].exist){
P[i][k].exist =1;
P[i][k].belong =0;
}
elseif (k-S[i]>=0){
if (P[i-1][k-S[i]].exist){
P[i][k].exist =1;
P[i][k].belong =1;
}
}
if (P[i][k].belong &&P[i][k].exist)std::cout<<"I ";
elseif(P[i][k].exist)std::cout<<"O ";
elsestd::cout<<"- ";
if (k>=10)
std::cout<<" ";
}
std::cout<<std::endl;
}
returnP[N][K].exist;
}
2、习题问题:令x1,x2,。。。xn是一组整数,试找到一个划分这个数组为2部分相等的方法,或者不能做出这样的划分
解答:与背包一样的解法,只是此时背包K的值为(x1+x2+...+xn)/2
代码:
int knapsack_for_sum_mod_2()
{
P[0][0].exist = 1;
std::cout<<" 0 ";
for (int k =1; k <= K; k++){
P[0][k].exist =0;
std::cout<<k<<" ";
}
std::cout<<std::endl;
for (int i =1; i <= N; i++){
std::cout<<S[i]<<" ";
for (int k =0; k <=K;k++){
P[i][k].exist =0;
if (P[i-1][k].exist){
P[i][k].exist =1;
P[i][k].belong =0;
}
elseif (k-S[i]>=0){
if (P[i-1][k-S[i]].exist){
P[i][k].exist =1;
P[i][k].belong =1;
}
}
if (P[i][k].belong &&P[i][k].exist)std::cout<<"I ";
elseif(P[i][k].exist)std::cout<<"O ";
elsestd::cout<<"- ";
if (k>=10)
std::cout<<" ";
}
std::cout<<std::endl;
}
//打印解
int n =N;
int k =K;
while(n>=1 && k>=0){
if (P[n][k].exist){
if (P[n][k].belong){
std::cout<<S[N]<<" ";
}
else{
for (; n >=1; n--){
if (P[n][k].belong){
std::cout<<S[n]<<" ";
k-=S[n];
break;
}
}
}
}
else
break;
}
std::cout<<std::endl;
returnP[N][K].exist;
}
- 简单背包问题
- 简单的背包问题
- 简单的背包问题
- 简单背包问题
- 简单0.1背包问题
- 简单背包问题
- 简单:01背包问题
- 简单:01背包问题
- 简单:01背包问题
- 简单背包问题!
- 简单的背包问题
- 简单背包问题模板
- 简单背包问题
- 简单背包问题<枚举>
- dfs 简单背包问题
- 简单背包问题
- 简单的背包问题
- 简单的背包问题
- 手机端的下拉刷新和上拉加载
- 图解TCP/IP 读后感
- SpringMVC学习记录--Validator验证分析
- git的常用命令
- 什么是java序列化,如何实现java序列化?
- 简单背包问题
- Prism框架(三)——基于模块的应用程序开发
- 编译,反编译,混淆,【一】
- 我在学校网站一页面上无意间发现了一个漏洞
- 大数据学习2——大数据处理架构Hadoop概述
- 【Python】选择ipython替代python的理由
- 【Scikit-Learn 中文文档】无监督学习: 寻求数据表示
- 获取Excel sheet页中实际有效行数(不是我写的,但是也不是我转载的)
- Java中使用Jedis操作Redis