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来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例 ...
随机推荐
- 【剑指offer】近期公共祖先
转载请注明出处:http://blog.csdn.net/ns_code/article/details/28113959 剑指offer上的最后一题了,一个递归函数调了一下午,才得到正确的结果. 题 ...
- OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中
OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...
- 04.URL路径访问与模块控制器之间的关系
<?php //初使化,进行加载. //通过这个英文名来了解,他是定义的与thinkphp有关的核心框架文件目录路径 //他可以通过这一个常量,在以后运行的时候都去找这个路径,确保在运行过程当, ...
- ios开发——实用技术篇OC篇&获取内存使用情况
获取内存使用情况 iOS 获取 当前设备 可用内存 及当前 应用 所占内存 (-- ::) 转载 ▼ 标签: ios 设备 可用内存 所占内存 内存 it 分类: iOS // 获取当前设备可用内存及 ...
- /proc/sysrq-trigger详解
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://itnihao.blog.51cto.com/1741976/830374 htt ...
- du 和 df命令的区别(超赞)
du和df命令都被用于获得文件系统大小的信息:df用于报告文件系统的总块数及剩余块数,du -s /<filesystem>用于报告文件系统使用的块数.但是,我们可以发现从df命令算出的文 ...
- debian root用户在shell下如何能够使用颜色
转载:http://hi.baidu.com/aivera/item/f31c4a590ef72609e6c4a596 编辑 /root/.bashrc 这个文件, 把里面这几行前面的#号去掉就可以了 ...
- Debian下MySQL配置
1 安装 $ apt-get install mysql-server $ apt-get install mysql-client 2 修改MySQL的口令 一般上一步会让你输入root密码,如果没 ...
- javascript 通过面向对象编写圆形数字时钟
效果如图所示,代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- MSP430常见问题之FLASH存储类
Q1:用IAR Embedded Workbench for MSP430 通过JTAG往MSP430上写程序.为了知道片内程序的版本,必须读出Flash 中内容.什么工具软件可以通过JTAG口实现这 ...