“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为 S,设有 N 件物品,其重量分别为w1,w2,...,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于 S 。
#include <stdio.h>
#define N 7//物品数量
#define S 15//要求背包重量
int W[N+1]={0,1,4,3,4,5,2,7};//各物品重量,W[0]不使用。。。
int knap(int s,int n)//s为剩余重量,n为剩余可先物品数。。
{
if(s==0)return 1;//return 1 means success..
if(s<0||(s>0&&n<1))return 0;
if(knap(s-W[n],n-1))
{
printf("%4d",W[n]);
return 1;
}
return knap(s,n-1);
}
void main()
{
if(knap(S,N))printf("/nOK!/n");
else printf("Failed!");
}
//非递归算法
#include <stdio.h>
#define N 7
#define S 15
typedef struct {
int S;
int n:
int job;
} KNAPTP;
int w[N+1] = {0,1,4,3,4,5,2,7};
int knap(int S,int n);
main(){
if ( knap(S,N) ) printf("0K!/n" );
else printf( "N0!/n" );
}
int knap( int S,int n )
{
KNAPTP stack[100],x;
int top, k, rep;
x.s = s; x.n = n;
x.job = 0;
top = l; stack[top] = x;
k = 0;
while ( top>0&&!k ) {
x = stack[top];
rep = l;
while ( !k && rep ) {
if( x.s=0 ) k = 1; /*已求得一组解*/
else if ( x.S<0 || x.n<=0 ){ rep = 0; top --;}
else {
x.s = x.s-w[x.n--] ; x.job=1;
stack[++top] = x;
}
}
}
if ( !k ) {
rep = 1;
while ( top >= 1 && rep) {
x = stack[top--];
if ( x.job=1){
x.s += w[x.n + 1];
x.job = 2;
stack[++top] = x;
rep=0 ;
}
}
}
if (k){ */输出一组解*/
while ( top >= 1 ) {
x = StaCk [ top-- ];
if ( x.job == 1 )
printf ( "M/t,w[x.n+1] );
}
}
return k;
}