标签:blog http io os for sp div 2014 问题
贪心的思想:通过每一步都找最优解决问题。因为每一步最优,最后是最优的概率很大。
部分背包的思想就是:把最值钱的往包里装,装得越多越好。可见设计算法的人好贪啊,嘿嘿~
样例:
n种东西,重量是Mi,价值是Vi,单价就是两者之比Pi。C为小包包的容量。最后算出的结果是对应取Xi放到包中。
代码如下:
#include<iostream>
using namespace std;
float *m,*v,*p,*x;
float c;//背包容量
int n,h;
void TaskInitial();
void result_out();
void Greedy_beibao();
void calculate_p();
int find_next_big_p(int);
void load_beibao(int);
int main()
{
TaskInitial();
Greedy_beibao();
result_out();
return 0;
}
/*基本输入输出*/
void TaskInitial()
{
cin>>c;//背包容量
cin>>n;//物品种类
m=(float *)malloc(n*sizeof(float));//存物品质量
v=(float *)malloc(n*sizeof(float));//存物品对应总价值
p=(float *)malloc(n*sizeof(float));//存放物品单价
x=(float *)malloc(n*sizeof(float));//存 放入背包的物品的数量
for(int i=0;i<n;i++)
{
cin>>*(m+i)>>*(v+i);
*(p+i)=(*(v+i))/(*(m+i));
*(x+i)=0;
}
}
void result_out()
{
float totalval=0;
for(int i=0;i<n;i++)
{
cout<<*(x+i)<<endl;
totalval+=((*(v+i))/(*(m+i)))*(*(x+i));
}
cout<<"总价值:"<<totalval<<endl;
}
/*贪心算法*/
void Greedy_beibao()
{
h=1;
load_beibao(find_next_big_p(h));
}
int find_next_big_p(int i)
{
float tempdata;
int k=0;
for(int j=0;j<n;j++)
if(*(p+j)>*(p+k))
k=j;
*(p+k)=0;
return k;
}
void load_beibao(int k)
{
if(c<=*(m+k))
*(x+k)=c;
else
{
*(x+k)=*(m+k);
c-=*(m+k);
h++;
if(h<=n)
load_beibao(find_next_big_p(h));
}
}
测试一下吧:


部分背包问题暂时搞定,继续!
标签:blog http io os for sp div 2014 问题
原文地址:http://www.cnblogs.com/liutianyi10/p/4043731.html