[算法课][贪心][背包]W12例2背包问题 原创

题目来源 算法课

算法标签 贪心,完全背包问题

题目描述

例2背包问题:

假如我们有一个可以装100kg物品的背包,我们有5种豆子,每种豆子的总量和总价值各不相同。为了让背包中所装的物品的总价值最大,我们如何选择装哪些豆子,每种装多少?【可以选择某种物品装部分】
在这里插入图片描述

答案

在这里插入图片描述

颜老板代码

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>

struct wp
{
	char name[5];
	double weight;
	double value;
	double price;
};

struct select
{
	char name[5];
	double weight;
	double price;
};

int n;

void input(struct wp *p,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("输入第%d个物品的信息\n",i+1);
		printf("输入物品名称=");
		gets((p+i)->name);
		printf("输入物品总量kg=");
		scanf("%lf",&(p+i)->weight);
		printf("输入物品总价值=");
		scanf("%lf",&(p+i)->value);
		(p+i)->price=(p+i)->value/(p+i)->weight;
		getchar();
	}

	system("pause");
}

void sort(struct wp *p,int n)
{
	struct wp t;
	int i,j;

	for(j=0;j<n-1;j++)
		for(i=0;i<n-1-j;i++)
		{
			if(( (p+i)->price )<( (p+i+1)->price))
			{
				t=*(p+i);
				*(p+i)=*(p+i+1);
				*(p+i+1)=t;
			}
		}
}

//进行背包问题的求解
int fun( struct wp *p,struct select *q,int n)
{
	double weight_sheng=100;
	int k=0;//准备存储数据到q中的位置变化
	int i;

	for(i=0;i<n;i++)
	{
		if( (p+i)->weight <= weight_sheng)
		{
			//说明当前第i个物品可以全部放入
			//当前p所指向的第i个物品名称、总量和单价存入q所指向的存储空间中
			strcpy((q+k)->name,(p+i)->name);
			(q+k)->weight=(p+i)->weight;
			(q+k)->price=(p+i)->price;
			k++;
			weight_sheng=weight_sheng-(p+i)->weight;
		}		
		else 
		{
			strcpy((q+k)->name,(p+i)->name);
			(q+k)->weight=weight_sheng;
			(q+k)->price=(p+i)->price;
			weight_sheng=0;
			break;
		}
	}

	return k;
}

void output(struct select *q,int k)
{
	int i;
	printf("物品    总量    单价\n");
	for(i=0;i<=k;i++)
	{
		printf("%-8s",(q+i)->name);
		printf("%-8.2lf",(q+i)->weight);
		printf("%-8.2lf\n",(q+i)->price);
	}
}

int main()
{
	struct wp *p;
	struct select *q;
	int k;

	printf("输入物品的数量:");
	scanf("%d",&n);
	getchar();

	p=(struct wp *)malloc(sizeof(struct wp)*n);
	q=(struct select *)malloc(sizeof(struct select)*n);

	input(p,n);
	sort(p,n);
	k=fun(p,q,n);
	output(q,k);
	return 0;
}

吐槽

长,强行用指针、malloc和模块化感觉很乱,因此我们领悟思路,直接不看代码写

思路

我们只需要理解,price/weight==val
如果val越高,就越优先处理即可
那么我们最终只需要一个结构体排序即可

AC代码

#include<iostream>
#include<algorithm>

using namespace std;

struct Node{
    string name;
    int price,weight;
};

bool cmp(Node a,Node b){return a.price/a.weight>b.price/b.weight;}//自定义结构体sort降序

int main()
{
    int sum,n;
    cin>>sum>>n;
    
    const int len = n;
    Node node[len+10];
    
    for(int i=0;i<len;i++)
        cin>>node[i].name>>node[i].weight>>node[i].price;
    
    sort(node,node+len,cmp);
    
    int cnt=0;
    while(sum)
    {
        if(sum>=node[cnt].weight){cout<<node[cnt].name<<" "<<node[cnt].weight<<endl;sum-=node[cnt].weight;}//优先处理最高
        else
        {
            cout<<node[cnt].name<<" "<<sum<<endl;
            sum=0;
        }
        cnt++;
    }   
    return 0;
}
posted @ 2023-02-08 13:52  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源