MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

zoj 3258

Posted on 2011-05-17 19:47  MDeath-Kid  阅读(245)  评论(0编辑  收藏  举报
代码
/*2011-05-17 19:26:31 Accepted 3258 C++ 230 1168 MDK */
#include
<iostream>
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define MAXN 50005
using namespace std;
typedef
struct bone
{
int valu;
int volu;
double bili;
bool type;
}bone;
bone ben[MAXN];
int cmp(const void *a,const void *b)
{
return (*(bone *)a).bili> (*(bone *)b).bili? -1 : 1;
}
main()
{
int N,V;
int vlou[MAXN] = {0};
double f[MAXN] = {0};
while(cin>>N>>V)
{

for(int i=0;i<1001;i++)
{
ben[i].type
=0;ben[i].valu=0;ben[i].volu=0;
ben[i].bili
=0;
}
for(int i=0;i<=V;i++)
f[i]
=0;
for(int i = 0;i<N;i++)
cin
>>ben[i].volu>>ben[i].valu>>ben[i].type,ben[i].bili=(double)ben[i].valu/(double)ben[i].volu;
/*if(V==0)
{
printf("0\n");
continue;
} //受不了了,就这里错了!
*/
qsort(ben,N,
sizeof(ben[0]),cmp);
for( int i = 0;i<N;i++)
if(!ben[i].type)
for(int j=V;j>=ben[i].volu;j--)//是否含有0这个值,BT数据有0值
{
if(f[j]<(f[j - ben[i].volu] + ben[i].valu))
{
f[j]
=(f[j - ben[i].volu] + ben[i].valu);
}
}
double ans=f[V];
int tw=0,tv=0;
for(int i=0;i<N;i++)
{
if(ben[i].type)
{
double per=ben[i].bili;
for(int j=0;j<=ben[i].volu;j++)
{
if(V-j-tw<0) break;
if(ans<f[V-j-tw]+j*per+tv)
{
ans
=f[V-j-tw]+j*per+tv;
//cout<<f[V-j-tw]+j*per+tv<<endl;
}
}
tv
+=ben[i].valu,tw+=ben[i].volu;
//printf("-------%.2f\n",ans);
}
}
printf(
"%.2f\n",ans);
}
}

原因居然是我要写“0.00”,神啊~

这是个背包+贪心的算法,还好这里背包和贪心石子都不涉及空间为0的情况。

先进行背包,然后对最后一层的背包贪心,排序放在最一开始对背包没影响,所以就放在一开始了。

double per=ben[i].bili;
for(int j=0;j<=ben[i].volu;j++)
{
if(V-j-tw<0) break;
if(ans<f[V-j-tw]+j*per+tv) //这里的思想和背包有点像
{
ans
=f[V-j-tw]+j*per+tv;
//cout<<f[V-j-tw]+j*per+tv<<endl;
}
}
tv
+=ben[i].valu,tw+=ben[i].volu;
//printf("-------%.2f\n",ans);