这几天着急忙慌的做了一些题(老费把时间卡的很紧),总觉得自己掌握的知识和这几天题目要求的差距太大,简直是一个地下,一个天上有木,这种感觉就像一个小学生去做高中生的数学题一样,所有的东西都是新的,都需要自己去从头学起。最近新学知识的课件也有很多完全陌生的东西,这些知识有些是互通的,我想一旦我明白了基础的东西,再从基础的东西向上扩展应该就不难了了吧,我现在最大的困难是对一些基本知识还没有概念,比如说结构体、指针、stl、贪心算法、当然也没怎么具体实践过,我学东西的速度很慢。不管多难,我会一直学下去,即便被老费t了,至少我是真真切切的学到东西了,就算参加不了比赛,我也知足了。加油加油
背包问题
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int val;//单位价值
int weight;
}PRO;
int comp(const void *a,const void *b)
{
return ((PRO*)b)->val-((PRO*)a)->val;
}
int main()
{
PRO a[10];
int i=0;
int m,n;
int val_sum=0;
int weight_sum=0;
printf("输入物品种类数目:\n");
scanf("%d",&n);
printf("依次输入重量和价值:\n");
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i].weight,&a[i].val);
}
printf("输入重量的限制:\n");
scanf("%d",&m);
qsort(a,n,sizeof(PRO),comp);
for(i=0;i<n&&(weight_sum<15);i++)
{
weight_sum+=a[i].weight;
val_sum+=a[i].weight*a[i].val;
}
if(weight_sum>m)
{
val_sum-=(weight_sum-m)*a[i-1].val;
}
printf("%d",val_sum);
}
最优装载问题
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
思路:根据贪心算法的思想,这里应该是每次先选择小的先装上,一直到超过限制就停止,最后输出编号就行了。
#include<stdio.h>
#include<stdlib.h>
typedef struct//定义集装箱结构体
{
int weight;
int num;
}W;
int comp(const void*a,const void *b)
{
return ((W*)a)->weight-((W*)b)->weight;
}
int main()
{
W a[10];
int i,j=0;
int n=0;
int m;
int sum=0;
printf("请输入集装箱的个数:\n");//方便测试不超过10
scanf("%d",&m);
printf("输入重量的最大限制:\n");
scanf("%d",&n);
printf("请输入每个集装箱的重量");
for(i=0;i<m;i++)
{
scanf("%d",&a[i].weight);
a[i].num=i+1;
}
qsort(a,m,sizeof(W),comp);//先排序
for(i=0;i<m;i++)//然后从小到大加起来
{
if(sum<=n)
sum+=a[i].weight;
else
{
j=i;
break;//记录最后的值
}
}
for(i=0;i<j;i++)
{
printf("第%d号: %d\n",a[i].num,a[i].weight);
}
return 0;
}
闲话就不多说了,小白还有太多的东西要学。