背包问题是npc问题。直接用枚举算法。要想增加效率,可以试着储存重复状态。
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?它是在1978年由Merkel和Hellman提出的。
算法思路请参考百科:http://baike.baidu.com/subview/841810/841810.htm
#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;isum+=s[i].x*a[i];
return sum;
}
//返回a方案的重量
int wfangan(int *a,int n){
int sum=0,i;
for(i=0;isum+=s[i].w*a[i];
return sum;
}
//返回a方案的体积
int vfangan(int *a,int n){
int sum=0,i;
for(i=0;isum+=s[i].v*a[i];
return sum;
}
//显示max方案的信息
void showmax(int *max){
int i;
for(i=0;iprintf("重量=%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;idofangan(max,fa,0); //递归查找价值最高方案
showmax(max); //显示最高价值方案
}