package qinglin.learn.arithmetic;
public class SackPro_01
{
public static void main(String[] args)
{
int[] src = { 2, 4, 5, 7, 10 };
select(18, src, 0, new int[src.length]);
}
/**
* @param total 总数
* @param src 源数据数组
* @param offset 源数组的起始位置
* @param bag 背包,装选中的数据
*/
private static void select(int total, int[] src, int offset, int[] bag)
{
if (total == 0)
{ //背包要求增加的重量为0,则直接打印背包 ,即递归结束条件
print(bag);
return;
}
//从起始值开始寻找第一个小于要求增加重量的数值
while (offset < src.length && total < src[offset])
offset++;
if (offset >= src.length)
return; //当没有源数据可以选择,则退出
//将问题化简为在剩下的源数据中,两个找到重量的问题
select(total, src, offset + 1, bag.clone()); //背包中含有offset位置的
select(total - src[offset], src, offset + 1, put(bag, src[offset]));//背包中不含有offset位置的
}
private static int[] put(int[] bag, int n)
{ //将数字放入背包中
int pos = -1;
while (bag[++pos] > 0)
; //找到背包中第一个数字为0的位置
bag[pos] = n;
return bag;
}
private static void print(int[] bag)
{ //打印背包中的数字
System.out.print("bag: ");
for (int n : bag)
{
if (n == 0)
break;
System.out.print(n + " ");
}
System.out.println();
}
}
/*using namespace std;
class Knapsack
{
public:
Knapsack(double *pp,double *ww,int nn,double cc)
{
p = pp;
w = ww;
n = nn;
c = cc;
cw = 0;
cp = 0;
bestp = 0;
x = new int[n];
cx = new int[n];
}
void knapsack()
{
backtrack(0);
}
void backtrack(int i)
{//回溯法
if(i > n)
{
if(cp > bestp)
{
bestp = cp;
for(int i = 0; i < n; i++)
x[i] = cx[i];
}
return;
}
if(cw + w[i] <= c)
{//搜索右子树
cw += w[i];
cp += p[i];
cx[i] = 1;
backtrack(i+1);
cw -= w[i];
cp -= p[i];
}
cx[i] = 0;
backtrack(i+1);//搜索左子树
}
void printResult()
{
cout << "可以装入的最大价值为:" << bestp << endl;
cout << "装入的物品依次为:";
for(int i = 0; i < n; i++)
{
if(x[i] == 1)
cout << i+1 << " ";
}
cout << endl;
}
private:
double *p,*w;
int n;
double c;
double bestp,cp,cw;//最大价值,当前价值,当前重量
int *x,*cx;
};
int main()
{
double p[4] = {9,10,7,4},w[4] = {3,5,2,1};
Knapsack ks = Knapsack(p,w,4,7);
ks.knapsack();
ks.printResult();
return 0;
}
*/
分享到:
相关推荐
算法效果较为良好,实现背包问题价值最大,采用遗传算法实现的比较不错的结果
通过遗传算法实现背包问题最优解求解,包括代码文档。
使用遗传算法解决0-1背包问题,调试成功,非常适合初学者了解遗传算法和0-1背包问题
课程作业,实现算法实践书后的例题,实现01背包问题
完全背包问题N件物品放入容量为C的背包。第i件物品的费用(重量、体积等)为wi,价值为vi。每件物品可以取用任意多次(无限数量),选择将哪些物品放入背包令总费用不超过背包的容量且物品的价值总和最大。输入格式...
用遗传算法解决背包问题,供大家参考交流。。。
这是背包问题的程序,用matlab实现,背包问题是NP完全问题
Matlab 代码,用遗传算法解决01背包问题
利用MATLAB,解决0-1背包问题,数据带入已经包含在主程序段里。需要使用直接粘贴到MATLAB更改数据即可
0-1背包问题问题,使用的回溯算法来实现了。挺简单的实现。
动态规划算法 0-1背包问题 各种各样的背包问题的原理分析
这是最基础的背包问题
基于粒子群优化算法的0-1背包问题,能正常运行,效果很好。
背包问题(Knapsack problem)是一种组合优化的NP完全问题
模拟退火算法解决0-1背包问题,检测结果真实有效
0-1背包问题_算法设计C++ 可以实现 大家分享学习
粒子群背包问题,最多处理数据500条.输入 pso 回车即可
模拟退火算法求解0-1背包问题。模拟退火算法求解0-1背包问题
背包问题0,1问题,贪婪算法MATLAB源程序
用matlab编程解决背包问题 可以运行 收敛效果好 附图