C语言,背包问题,用递归算法,下面这个怎么编程,谢谢!

2025-01-31 13:04:47
推荐回答(2个)
回答1:

背包问题是npc问题。直接用枚举算法。要想增加效率,可以试着储存重复状态。
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?它是在1978年由Merkel和Hellman提出的。

算法思路请参考百科:http://baike.baidu.com/subview/841810/841810.htm

回答2:

#include 
#define V 500  //最多体积 
#define W 100  //最多重量 
#define N 5    //物品种类 
typedef struct data{
int v; //体积 
int w; //重量 
int n; //数量 
int x; //价值 
}DATA;
DATA s[N]={
{30,3,10,4},
{50,8,10,5},
{10,2,10,2},
{23,5,8,3},
{130,20,5,11}
};
//返回a方案的价值 
int xfangan(int *a,int n){
int sum=0,i;
for(i=0;i sum+=s[i].x*a[i];
return sum;
}
//返回a方案的重量
int wfangan(int *a,int n){
int sum=0,i;
for(i=0;i sum+=s[i].w*a[i];
return sum;

//返回a方案的体积 
int vfangan(int *a,int n){
int sum=0,i;
for(i=0;i sum+=s[i].v*a[i];
return sum;
}
//显示max方案的信息 
void showmax(int *max){
int i;
for(i=0;i printf("重量=%d 体积=%d 价值=%d\n",wfangan(max,N),vfangan(max,N),xfangan(max,N));
}
//选择方案 
void dofangan(int *max,int *fa,int n){
int i;
if (n>=N) return;
for(fa[n]=0;fa[n]<=s[n].n;fa[n]++){
if (vfangan(fa,n+1)>V) break;  //超大 
if (wfangan(fa,n+1)>W) break;  //超重 
if (xfangan(fa,n+1)>xfangan(max,N)){  //更有价值 
for(i=0;i<=n;i++) max[i]=fa[i];
for(i=n+1;i }
dofangan(max,fa,n+1);
}
}
int main(){
int max[N],fa[N],i;
for(i=0;i dofangan(max,fa,0); //递归查找价值最高方案 
showmax(max);  //显示最高价值方案 
}