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来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例 ...
随机推荐
- DashClock
https://github.com/romannurik/dashclock/ https://github.com/nhaarman/DashPinkpop dashclock-master.zi ...
- cookie转CookieCollection
CookieCollection cookiesResponse = new CookieCollection(); if (response != null) { foreach (string c ...
- javascript操作
1. >> 按位右移运算符 result = expression1 >> expression2 右移表达式的位,保持符号不变. >> 运算符将 expressi ...
- iOS viewDidUnload方法
转自:http://blog.csdn.net/chun799/article/details/8951694 在iOS6中,viewDidUnload回调方法被Deprecated掉了.查看苹果的文 ...
- 琐碎-将hadoop源码作为工程导入eclipse
之前写过如何用eclipse看hadoop源码,虽然非官方版的,但是可以达到目的,最重要是简单方便快速 官方版(hadoop2.2.0)的也有: 源码目录为: 和之前的源码目录有很大的不同 编译的时候 ...
- 使用OPC的方式去连接PLC进行AB SLC-5_04数据的采集
1. 必备软件 Rslinx classic 2.57 .net framework 2.0 VS2013 OS: win7 enterprise x64 2. 软件安装 2.1.安装RSlinx ...
- cocos2d-x lua 调用onEnter和onExit
cocos2d-x lua 调用onEnter和onExit version: cocos2d-x 3.6 onEnter和onExit在lua中不会因节点别add和remove而直接被调用,当子节点 ...
- Android(java)学习笔记103:Map集合的获取功能
package cn.itcast_01; import java.util.Collection; import java.util.HashMap; import java.util.Map; i ...
- Android(java)学习笔记94:关于广播接收者的注册和使用心得
下面我们先看一部分代码,由代码进行进一步的深入: registerReceiver( new BroadcastReceiver() {//onReceive中代码的执行时间不要超过5s,androi ...
- hdu 1325 Is It A Tree?
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...