一、原题
假设有一组物品,各个物品的质量已知,现有一个背包,背包能够容纳的质量总和S已知,问能否从这N个物品中取出若干个恰好装入这个背包中。
二、递归算法
本质思想:设法尝试所有组合,当部分组合已经无法满足条件时,立即停止当前组合的尝试;若出现第一个满足条件的组合,立即停止尝试。使用递归回溯法实现。(感觉这东西不是我这种菜鸟能够说明白的,还得自己慢慢体会,最好的方法就是耐住性子跟踪调试)。
上“酸菜”
#include <stdio.h>
#include <stdlib.h>
#define N 7 //物品种类
#define S 15 //背包容量
int w[N+1]={0,1,4,3,4,5,2,7}; //各种物品的质量
bool knap(int s,int n) //s代表背包剩余容量,n代表还未尝试装载的物品种类
{
if(s==0) //恰好装完
{
return true;
}
if(s<0 || (s>0 && n<1)) //不能完成装载
{
return false;
}
if(knap(s-w[n],n-1)) //当前物品能够装载,则递归
{
printf("%d ",w[n]);
return true;
}
else
{
return knap(s,n-1); //当