东软笔试题--软件工程师(应届)

yuanxiaojin 2004-12-07 07:51:32
鄙人不才,刚刚参加笔试回来,就是有题不会啊,请朋友们帮忙!
背包问题:(也许你已经知道了!)
背包只能装s重量,有N个物体,重量分别为w1,w2...wn,若要蒋背包恰好装s ,问如何用递归方法实现,语言不限。
希望朋友们给答案!
...全文
2219 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuweibo 2004-12-08
  • 打赏
  • 举报
回复
理论性太强了!看了就旋!
okitgo 2004-12-08
  • 打赏
  • 举报
回复
查查书吧,早忘了
apan1979 2004-12-08
  • 打赏
  • 举报
回复
import java.util.Vector;

public class KAO
{
public boolean digui(double s,double[] w,Vector retVec)
{
int i,j;
double dblSum = 0; //放入包的总重量
boolean blnFind = false; //找到标志
double[] subW = null;
int nowSize = retVec.size();

//算出已经放入包的重量
for(i=0; i<nowSize; i++) dblSum += ((Double)retVec.get(i)).doubleValue();

//逐个递归
for(i=0; i<w.length; i++)
{
Double dblobj = new Double(w[i]);
retVec.add(dblobj);
dblSum += w[i];
if(dblSum==s)
return true;
else
{
subW = new double[w.length-1];
System.arraycopy(w,0,subW,0,i);
System.arraycopy(w,i+1,subW,i,subW.length-i);
blnFind = digui(s,subW,retVec);
if(blnFind)
return true;
else
retVec.removeElementAt(nowSize);
}//end if
}//end for

return false;
}

public static void main(String[] args)
{
Vector vec = new Vector();
KAO kao = new KAO();
double S = 21;
double[] W = new double[]{7,4,2,9,5,1,3,6,8,10};
boolean blnFind = kao.digui(S,W,vec);
if(blnFind)
{
for(int i=0; i<vec.size(); i++)
System.out.println( ((Double)vec.get(i)).doubleValue() );
}

}
}
findingnimo 2004-12-08
  • 打赏
  • 举报
回复
有点不对。

/**
* 递归函数,放置指定的物件
* @param things Thing[]
* @param previousCont int
* @param curNum int
* @return boolean
*/
private boolean putThings(Thing[] things, int previousCont, int curNum){
if(things == null){
return false;
}

if(previousCont < allWeight){
for (int i = curNum; i < things.length; i++) {
if(putThings(things, previousCont + things[i].getWeight(), i + 1)){
myThings.add(thingNum++, things[i]);
return true;
}
}
} else if(previousCont == allWeight){
return true;
}

return false;
}

public String toString(){
StringBuffer b = new StringBuffer("I am a Bag, my weight is " + allWeight + ".\r\n I have " + thingNum + " Things: \r\n");

for(int j = 1; j <= myThings.size(); j++){
b.append(" The " + j + " Thing's weight is " + myThings.get(j-1) + ";\r\n");
}

return b.toString();
}
louisbadbad 2004-12-08
  • 打赏
  • 举报
回复
楼上的就正确,前面的那个我没看
cao8208 2004-12-08
  • 打赏
  • 举报
回复
/* 简化背包问题的递归算法*/

#include<stdio.h>
#include<stdlib.h>

int knap(int s, int n, int w[]) {
if ( s == 0 )
return (1);
else if ( s<0 || s>0 && n<1 )
return(0);
else if ( knap(s - w[n-1], n - 1, w)==1 ) {
printf("result: n=%d ,w[%d]=%d \n", n, n-1, w[n-1]);
return (1);
}
else
return ( knap(s, n - 1, w) );
}

int main() {
int* w;
int s = 0, n = 0, result = 0, i = 0;
printf("please input s = ");/*输入s*/
scanf("%d", &s);
printf("please input n = ");/*输入n*/
scanf("%d", &n);
w = (int*)malloc(n*sizeof(int));
printf("please input the %d numbers(weight):\n", n);/*输入重量*/
for (i = 0; i < n; i++)
scanf("%d", w+i);
result = knap(s, n, w);
if (result == 0)
printf("no solution!\n");
return 0;
}
findingnimo 2004-12-08
  • 打赏
  • 举报
回复
以下是用Java写的代码。
它只找到一种方案就返回。


package untitled2;

import java.util.List;
import java.util.ArrayList;

/**
* 物件类
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
class Thing {
private int myWeight;

public Thing(int weight){
myWeight = weight;
}

public int getWeight(){
return myWeight;
}

public void setWeight(int weight){
myWeight = weight;
}

public String toString(){
return Integer.toString(myWeight);
}
}

/**
* 包包类
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
class Bag{
private List myThings = new ArrayList();
private int allWeight = 0;
private int thingNum = 0;

public Bag(int cont) {
allWeight = cont;
}

public List getThings(){
return myThings;
}

public boolean putThings(Thing[] things){
return putThings(things, 0, 0);
}

/**
* 递归函数,放置指定的物件
* @param things Thing[]
* @param previousCont int
* @param curNum int
* @return boolean
*/
private boolean putThings(Thing[] things, int previousCont, int curNum){
if(things == null){
return false;
}

if(previousCont < allWeight){
for (int i = curNum; i < things.length; i++) {
myThings.add(curNum, things[i]);
if(putThings(things, previousCont + things[i].getWeight(), curNum+1)){
return true;
}
}
} else if(previousCont == allWeight){
thingNum = curNum;
return true;
}

return false;
}

public String toString(){
StringBuffer b = new StringBuffer("I am a Bag, my weight is " + allWeight + ".\r\n I have " + thingNum + " Things: \r\n");

for(int j = 1; j <= thingNum; j++){
b.append(" The " + j + " Thing's weight is " + myThings.get(j-1) + ";\r\n");
}

return b.toString();
}

}

public class Recursion {
public static void main(String argv[]){
Thing[] things = new Thing[10];
for(int i = 0; i < 10; i++){
things[i] = new Thing(i + 1);
}

Bag bag = new Bag(3);

if(bag.putThings(things)){
System.out.println(bag);
}
}
}
dadunqingwa 2004-12-08
  • 打赏
  • 举报
回复
数据结构不强 ……挨……
wangwei8117 2004-12-08
  • 打赏
  • 举报
回复
经典老题了,以前的高级程序员的书里都有这个背包问题的,找书看了就知道,递归问题!
frhwxx 2004-12-08
  • 打赏
  • 举报
回复
晕!
haha7 2004-12-08
  • 打赏
  • 举报
回复
数据结构里的经典题吧,在堆栈那好像。
jerrykey 2004-12-08
  • 打赏
  • 举报
回复
到东软笔试的精髓就是数据结构。数据结构不精通就会被认为是基础不好,根本做不了东西。于是肯定不合格。
loverisyour 2004-12-08
  • 打赏
  • 举报
回复
学习
lengxue129 2004-12-08
  • 打赏
  • 举报
回复
在高级程序员和中级程序员书中就有这个背包问题的解法。你可以去查一下
yuanxiaojin 2004-12-08
  • 打赏
  • 举报
回复
如果加到最后,就省一个了,可就是没有那个重量了,怎么办啊?排序可以解决问题吗?
一组数应该可以有几组解,而不是唯一解。
lansefeng 2004-12-08
  • 打赏
  • 举报
回复
递归的for循环
misscheng 2004-12-08
  • 打赏
  • 举报
回复
递归我也不会.
kennymoni 2004-12-08
  • 打赏
  • 举报
回复
最新的软件设计师里面,这是基础题~~
东软这么好吗?
还是任何软件公司都要笔试这些东东呀????
fmzbj 2004-12-08
  • 打赏
  • 举报
回复
楼上的哥们,程序写得是不错,可你叫人怎么看得懂?注释都不写!!!
long2519 2004-12-08
  • 打赏
  • 举报
回复
和楼上一样的学习...
加载更多回复(9)

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧