编辑代码

#include "stdio.h"  

void Knapsack(int n,float M,float v[],float w[],float x[]);  

void swap(float *x, float *y)
//指针变量交换两个数的值,函数内部要交换两个数的值要通过指针交换
{
	float t = *x;
	*x = *y;
	*y = t;
}

void selectsort(int n,float v[],float w[]){//选择排序
	for(int i=1;i<=n;i++)
		for(int j=i;j<n;j++)
			if((v[i]/w[i]) < (v[j]/w[j])){
				swap(&v[i],&v[j]);
				swap(&w[i],&w[j]);
				
			}
}

  
void Knapsack(int n,float M,float v[],float w[],float x[])  
{    
    int i;  
    float sum; 
    for (i=1;i<=n;i++)  
    {  
        x[i]=0;//初始化数组
    }  
  
    float c=M;  
    for (i=1;i<=n;i++)//物品整件被装下,x[i]=1  
    {  
        if (w[i]>c)  
        {  
            break;  
        }  
        x[i]=1;  
        c-=w[i];  
        sum+=v[i];
    }  
  
    //物品i只有部分被装下  
    if (i<=n)  
    {  
        x[i]=c/w[i];  
        sum+=(x[i]*v[i]);
    }  
    printf("背包总价值为:%.1f\n",sum); 
}  

int main()  
{  
    float M = 20;//背包所能容纳的重量  
    //下标从1开始  
    float w[] = {0, 15, 18, 10, 9}; //重量 
    float v[] = {0, 300, 180, 150, 270};  //价值  
    int N = sizeof(w) / sizeof(w[0]);  //物品数量 
    float x[N];  
  
  	selectsort(N,v,w);
    Knapsack(N,M,v,w,x);  
  
  
    return 0;  
}