[算法课][贪心][背包]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;
}

浙公网安备 33010602011771号