子集和问题 回溯法0-1背包问题

回溯法解决01背包问题_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
回溯法解决01背包问题
上传于||暂无简介
大小:702.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
动态规划和回溯法解0-1背包问题
下载积分:1000
内容提示:0-1背包问题。 。一、问题描述与分析。经常遇到一些复杂的问题,有时我们将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。由于分解到的子问题往往不是独立的,用一个表来记录所有已解决的子问题的答案,这样就得到了原问题的解,这就是动态规划法的基本思想。 回溯法有“通用解题法”之称。它可以系统地搜索问题的所有解。回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。这种以深度优先方式搜索问题解的算法称为回溯法。。0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?。二、算法设计。1. 设所给0-1背包问题的子问题max?k?invkxk??wkxk?j?k?i和?x的最有值为m(i,j)的背包容量为k??0,1?,i?k?n??n。j,可选择物品为i,i+1,...,n时0-1背包问题的最优值。由0-1背包问题
文档格式:DOC|
浏览次数:42|
上传日期: 14:11:48|
文档星级:
该用户还上传了这些文档
动态规划和回溯法解0-1背包问题
官方公共微信 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
0-1背包问题的解决(回溯法)
下载积分:200
内容提示:0-1背包问题的解决(回溯法) 本文档属于精品文档、课件..
文档格式:PDF|
浏览次数:103|
上传日期: 08:55:12|
文档星级:
该用户还上传了这些文档
0-1背包问题的解决(回溯法)
官方公共微信编写程序实现0-1背包问题 - 算法面试题 - 职友集(发现中国好公司)
<meta name="description" content="#include
#define ymax 100
#def..." />
编写程序实现0-1背包问题
阅读( 138 )
#define ymax 100
#define nmax 100
float f[nmax][ymax];
void Knapsack(float p[],int w[],int c,int n)
int y=0,i=0;
for(y=0;y&y++)
f[n][y]=0;
for(y=w[n];y&=c;y++)
f[n][y]=p[n];
for(i=n-1;i&1;i&#8211;)
for(y=0;y&y++)
f[i][y]=f[i+1][y];
for(y=w[i];y&=c;y++)
&#123; if(f[i+1][y]&f[i+1][y-w[i]]+p[i])
f[i][y]=f[i+1][y];
f[i][y]=(f[i+1][y-w[i]]+p[i]);
f[1][c]=f[2][c];
if(c&=w[1])
if(f[1][c]&(f[2][c-w[1]]))
f[1][c]=f[1][c];
f[1][c]=f[2][c-w[1]]+p[1];
void Traceback(int w[],int c,int n,int x[])
for(i=1;i&n;i++)
if(f[i][c]==f[i+1][c])
if(x[n]==f[n][c])
int main()
float s=0,temp=0;
int m=0,n=0,i=0,*w,*x;
printf(&#8220;请输入背包的最大体积:&#92;nm=&#8221;);
scanf(&#8220;%d&#8221;,&m);
printf(&#8220;请输入背包中物品的个数:&#92;nn=&#8221;);
scanf(&#8220;%d&#8221;,&n);
p=(float*)malloc((n+1)*sizeof(float));
printf(&#8220;请输入各物品的价值:&#92;n&#8221;);
for(i=1;i&=n;i++)
scanf(&#8220;%f&#8221;,p+i);
w=(int*)malloc((n+1)*sizeof(int));
printf(&#8220;请输入各物品的重量:&#92;n&#8221;);
for(i=1;i&=n;i++)
scanf(&#8220;%d&#8221;,w+i);
x=(int*)malloc((n+1)*sizeof(int));
Knapsack(p,w,m,n);
Traceback(w,m,n,x);
s=f[1][m];
printf(&#8220;您装入背包中物品的总价值为: %f&#92;n&#8221;,s);
for(i=1;i&=n;i++)
if(x[i]==1)
printf(&#8220;
%f&#8221;,p[i]);
printf(&#8220;
%d&#92;n&#8221;,w[i]);
分享给朋友:
亲~ 如果您有更好的答案 可在评论区发表您独到的见解。
您想查看更多的信息:
算法面试题目推荐
微信公众号回溯法解决0-1背包问题 java写的 求大神指点~~~~(&_&)~~~~_百度知道
回溯法解决0-1背包问题 java写的 求大神指点~~~~(&_&)~~~~
代码:import java.util.*;public class Main {
static int[] v = new int[n];
static int[] w = new int[n];
static int bestp=0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
n = input.nextInt();
c = input.nextInt();
for(int i=0; i&v. i++)
v[i] = input.nextInt();
for(int i=0; i&w. i++)
w[i] = input.nextInt();
Backtrack(0);
System.out.println(bestp);
public static int Bound(int i)
for(j=i;j&n;j++) b+=v[j];
public static void Backtra俯紶碘咳鄢纠碉穴冬膜ck(int i){
if(cw+w[i]&=c){
Backtrack(i+1);
if(cp+Bound(i+1) & bestp)
Backtrack(i+1);
}}但出现Exception in thread &main& java.lang.ArrayIndexOutOfBoundsException: 0
at javaapplication43.Main.Backtrack(Main.java:36)
at javaapplication43.Main.main(Main.java:19)Java Result: 1
提问者采纳
因为你把n和c 定义为static ,而且初始化为0,。数组也为静态的,一个类中静态的变量在这个类加载的时候就会执行,所以当你这类加载的时候,你的数组static int[] v = new i俯紶碘咳鄢纠碉穴冬膜nt[n];
static int[] w = new int[n];
就已经初始化完毕,而且数组大小为0。在main方法里动态改变n的值是改变不了已经初始化完毕的数组的大小的,因为组已经加载完毕。我建议你可以在定义n,c是就为其赋初值。比如(static int n=2
static int c=3)
提问者评价
got it,thank you
其他类似问题
为您推荐:
其他1条回答
把这两俯紶碘咳鄢纠碉穴冬膜行代码
static int[] v = new int[n];
static int[] w = new int[n];放在
n = input.nextInt();
c = input.nextInt()后面
thank you, too
背包问题的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 子集和问题 回溯法 的文章

 

随机推荐