背包只能装s重量,有N个物体,重量分别为w1,w2...wn,若要蒋背包恰好装s ,问如何用递归方法实现,语言不限。
C语言实现
/* 简化背包问题的递归算法*/
#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;
}
Java语言实现1
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() );
}
}
}
Java语言实现2
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++) {
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();
}