贪心算法解背包问题

这段代码展示了如何使用贪心算法解决完全背包问题。通过读取`input.txt`文件中的数据,计算每单位重量的价值,并按单位价值降序排列。然后根据背包的容量,选择能装入的物品,最大化总价值。程序最后将结果输出到`output.txt`文件。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述```cpp
#include<stdio.h>
#include<stdlib.h>
#include
#include
#define N 3
#define M 3
using namespace std;
int data[NM+1];
int opdata[N
M+1];
int sum=0;//初始化为0
int fw[N];
int opw[N];
int opv[N];
struct item{
int weight;
int value;
float sv;
float rate;//使用率

}items[N*M+1];
item b;
void Rank(int array[], int start, int last)
{
int i = start;
int j = last;
int temp=array[i];

if (i < j)
{
    while (i < j)
    {
        //
        while (i < j &&  array[j]>= temp)
            j--;
        if (i < j)
        {
            array[i]= array[j];
            i++;
        }

        while (i < j && temp > array[i])
            i++;
        if (i < j)
        {
            array[j] = array[i];
            j--;
        }
                    
    }
    //把基准数放到i位置
    array[i] = temp;
    //递归方法
    Rank(array, start, i - 1);
    Rank(array, i + 1, last);
}

}

void Greedy(int c,int v[],int w[],int sv[])
{//贪心算法

		Rank(sv,0,N-1);//重点注意是0-N-1而不是0-N 

// for(int i=0;i<N;i++)
//{cout<<“我是排好的单位价值”<<sv[i]<<endl;
// }
for(int i=N-1;i>-1;i–)
{for(int j=0;j<N;j++)
{if(sv[i]==v[j]/w[j])//如果相等
fw[N-1-i]=w[j];//装到最终与单位价值相对应的哪个数组中去
}}
//for(int i=0;i<N;i++)
//{cout<<“我是最终重量”<<fw[i]<<endl;
// }

for(int i=0;i<N;i++)
{if(fw[i]<=c)//如果i物件的整体重量小于背包当前可承重量,就把他放进去
{items[i].rate=1;
sum+=sv[N-1-i]fw[i];
c-=fw[i];
// cout<<“我被装进去了”<<fw[i]<<“kg”<<endl;
opw[i]=fw[i];//被装入的重量
opv[i]=sv[N-1-i]fw[i];//被装入的价值
}
else if
(fw[i]>c&&c!=0)
{
//cout<<“fw[i]=”<<fw[i]<<“c=”<<c<<endl;
items[i].rate=c/float(fw[i]);
// cout<<“rate=”<<items[i].rate<<“我被装进去了”<<items[i].rate
fw[i]<<“kg”<<endl;
// cout<<“最后一个单位价值:”<<sv[N-1-i]<<endl;
opw[i]=items[i].rate
fw[i];//被装入的重量
opv[i]=items[i].rate*fw[i]sv[N-1-i];//被装入的价值
sum+=items[i].rate
fw[i]*sv[N-1-i];
c-=opw[i];
// cout<<“目前总额:”<<sum;
}
else break;

}

}
int main()

{
int c;
int sv[N];//创建数组
int v[N];
int w[N];
FILE *fp=fopen(“output.txt”,“w”);

ifstream fileinput;
fileinput.open(“input.txt”);
for(int i=0;i<N*M+1;i++)
{
fileinput>>data[i];
//把txt文件中的数字全部放在data中
}

		c=data[0];//例子中是把50赋值给C 
			 for(int i=0;i<N;i++)
			{
			w[i]=data[2+M*i]; //赋值重量到w中
			v[i]=data[3+M*i];	//赋值价值到v中 
			sv[i]=v[i]/w[i];//单位价值 

// cout<<“我是单位价值:”<<sv[i]<<endl;
items[i].rate=0;//初始化每件物品的使用率

			  } 

Greedy(c,v,w,sv);
cout<<“目前总额:”<<sum;
// for(int i=0;i<N;i++)
//{cout<<“单位价值:”<<sv[i]<<“重量:”<<fw[i];
//}
opdata[0]=sum;

for(int i=0;i<N*M+1;i++)

{opdata[1+M*i]=i+1;
 opdata[2+M*i]=opw[i];
opdata[3+M*i]=opv[i];
 }

// //存入txt文件中 

for(int i=0;i<N*M+1;i++)
{
fprintf(fp,"%d",opdata[i]);
if(i0||i%30)
{fprintf(fp,"\n");
}
else
{fprintf(fp," ");
}

		}
		
		return 0;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值