0-1背包问题与N皇后问题的纠结
昨日同学要我帮他看一道算法,如下:

是不是乍一看是“0-1背包”问题呀,我也这么想,于是就这么兴致勃勃的开始用这个想法去思考怎么算。但是算法也忘得差不多,回去赶紧补补,也趁着这次机会好好复习一下算法,于是觉得“0-1背包”问题实现了,这个问题也差不多了吧:
/***********************0-1背包*************************************/
//先将那两个条件忽略,单纯利用动态规划 -------------------这里就看出有多傻-—_--
//利用动态规划求解
#include <iostream>
#define MAX_NUM 50
#define MAX_WEIGHT 100
using namespace std; //动态规划求解
int zero_one_pack(int total_weight, int w[], int v[], int flag[], int n) {
int c[MAX_NUM + ][MAX_WEIGHT + ] = { }; //c[i][j]表示前i个物体放入容量为j的背包获得的最大价值
// c[i][j] = max{c[i-1][j], c[i-1][j-w[i]]+v[i]}
//第i件物品要么放,要么不放
//如果第i件物品不放的话,就相当于求前i-1件物体放入容量为j的背包获得的最大价值
//如果第i件物品放进去的话,就相当于求前i-1件物体放入容量为j-w[i]的背包获得的最大价值
for (int i = ; i <= n; i++) {
for (int j = ; j <= total_weight; j++) {
if (w[i] > j ) {
// 说明第i件物品大于背包的重量,放不进去
c[i][j] = c[i - ][j];
} else {
//说明第i件物品的重量小于背包的重量,所以可以选择第i件物品放还是不放
if (c[i - ][j] > v[i] + c[i - ][j - w[i]]) {
c[i][j] = c[i - ][j];
}
else {
c[i][j] = v[i] + c[i - ][j - w[i]];
}
}
}
} //下面求解哪个物品应该放进背包
int i = n, j = total_weight;
while (c[i][j] != ) {
if (c[i - ][j - w[i]] + v[i] == c[i][j]) {
// 如果第i个物体在背包,那么显然去掉这个物品之后,前面i-1个物体在重量为j-w[i]的背包下价值是最大的
flag[i] = ;
j -= w[i];
}
--i;
}
return c[n][total_weight];
} //回溯法求解 int main() {
int total_weight = ;
int w[] = { ,, , , , , };
int v[] = { ,, , , , ,};
int flag[]; //flag[i][j]表示在容量为j的时候是否将第i件物品放入背包
int total_value = zero_one_pack(total_weight, w, v, flag, );
cout << "需要放入的物品如下" << endl;
for (int i = ; i <= ; i++) {
if (flag[i] == )
cout << i << "重量为" << w[i] << ", 价值为" << v[i] << endl;
}
cout << "总的价值为: " << total_value << endl;
system("pause");
return ;
}
查看一下结果,

卧槽,瞎了。背包值这么大原来!于是乎还是想着如何利用“0-1背包”解决,但越想越不对劲,要让程序记住所有路径然后根据条件进行筛选,发现是在太过于复杂。但什么算法可以呢,于是想到了N皇后问题,介于设置的最大载重量太大,不具代表性,于是大大减少最大载重量,设计一下,行表示要存放的对象,列用1,0表示是否要放入,利用不断的回溯递归取得所有可能的值,再选择最大值:

/***********************N皇后*****************************************/
#include <iostream>
using namespace std; int total_weight = ; //修改最大值
int w[] = { , , , , , , };
int v[] = { , , , , , , };
int result[] = { };
int result_all[][] ;//用于存储所有的可能结果
int indi = ; //结果指针
int num = ; int sumV();
int sumW(int n); //判断下一个是否符合条件
bool judge(int n)
{
if (n == )
{
if (result[] >= result[])
return true;
else
return false; }
if (n == )
{
if ((result[] + result[]) == )
return true;
else
return false;
} if (sumW(n) > total_weight)
return false;
return true;
} //主要的递归调用函数
void backtrack(int n)
{
if (n > num) { for (int i = ; i <= num; i++)
{
result_all[indi][i] = result[i];
}
indi++;
} else
{
for (int i = ; i >= ; i--)
{
result[n] = i;
if (judge(n))
backtrack(n+);
}
}
} //计算综价值
int sumV( )
{
int m = ;
for (int i = ; i <= num; i++)
{
if (result[i] == )
m += v[i];
}
return m;
}
//计算重量
int sumW(int n)
{
int m = ;
for (int i = ; i <= n; i++)
{
if (result[i] == )
m += w[i];
}
return m;
} int main()
{
backtrack(); //计算最大值
int most = ;
int pos = ;
for (int i = ; i < indi; i++)
{
int temp = ;
for (int j = ; j <= num; j++)
{
if (result_all[i][j] == )
temp += v[j];
}
if (temp>most)
{
most = temp;
pos = i; }
} cout << "最大值是:"<<most<<endl;
cout << "结果是:" << endl;
for (int i = ; i <= num; i++)
{
cout << result_all[pos][i]<<" ";
}
cout << endl;
system("pause");
}
结果:

所以说啊,算法死记硬背是没啥用的,还得看具体情况来,算法还得多学,这次教训大了。
0-1背包问题与N皇后问题的纠结的更多相关文章
- 蓝桥杯 0/1背包问题 (java)
今天第一次接触了0/1背包问题,总结一下,方便以后修改.不对的地方还请大家不啬赐教! 上一个蓝桥杯的例题: 数据规模和约定 代码: import java.util.Scanner; public ...
- 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...
- Java实现动态规划法求解0/1背包问题
摘要: 使用动态规划法求解0/1背包问题. 难度: 初级 0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进 ...
- 0/1背包问题(DP)
Description 给定 n 个物品和一个背包.物品 i 的重量是 wi ,其价值为 vi ,背包的容量为 C .问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? Input 输入 ...
- hdu2602Bone Collector ——动态规划(0/1背包问题)
Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...
- 深入N皇后问题的两个最高效算法的详解 分类: C/C++ 2014-11-08 17:22 117人阅读 评论(0) 收藏
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...
- 八皇后java算法
import java.util.Date; public class EightQueen { public static void main(String[] args) { long star ...
- Python解决八皇后问题
最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...
- python学习八皇后问题
0 # -*- coding: utf-8 -*- 1 import random #冲突检查,在定义state时,采用state来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例 ...
随机推荐
- S5PV210开发系列四_uCGUI的移植
S5PV210开发系列四 uCGUI的移植 象棋小子 1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...
- makefile中的patsubst
函数名称:加前缀函数—addprefix. 函数功能:为“NAMES…”中的每个文件名称加入前缀“PREFIX”.參数“NAMES…”是空格切割的文件名称序列,将“SUFFIX”加入到此序列的每个文件 ...
- java中接口的定义与实现
1.定义接口 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,当中接口体由常量定义和方法定义两部分组成.定义接口的基本格式例如以下: [修饰符] in ...
- javascript操作
1. >> 按位右移运算符 result = expression1 >> expression2 右移表达式的位,保持符号不变. >> 运算符将 expressi ...
- Ruby on Rails Tutorial 第二章 之 微博资源
1.微博模型如下图所示: 2.创建微博资源,命令如下: $ rails generate scaffold Micropost content:text user_id:integer #生成微博资 ...
- C++:构造函数和析构函数能否为虚函数
原文:http://blog.csdn.net/xhz1234/article/details/6510568 C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可 ...
- X - Urban Elevations
Urban Elevations An elevation of a collection of buildings is an orthogonal projection of the buil ...
- Customer reviews on Lexia3 V48 diagnostic tool in EOBD2.FR
Robert said: Ok, so I bought a Lexia3 interface from EOBD2.FR in 2010. I have had no issues over the ...
- php.ini 配置文件的深入解析
[PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化, ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;;;;; ...
- Linux下VirtualBox出现kernel driver not installed的解决方法
今天安装好rhel-server-6.6-i386后,再安装VirtualBox成功,但是再VirtualBox中创建虚拟机的时候出现了“不能为xx虚拟机打开新任务” 并弹出如下的错误信息: