代码
/*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);