题目链接:http://codevs.cn/problem/1102/
0-1背包问题
听说贪心不能A?加个随机化不就完了嘛……
每次按照物品的价值和重量的比例从大到小排序,然后random十组数换一换,从前到后贪心拿……
随机20000次90分,50000次AC…………
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
int n,m,ans = 0;
struct food
{
int w,c;
}a[200];
int cmp(food a,food b)
{
double x = (double)a.c/a.w;
double y = (double)b.c/b.w;
return x > y;
}
void px()
{
sort(a+1,a+n+1,cmp);
for(int i = 1;i <= 10;i ++)
swap(a[rand()%n+1],a[rand()%n+1]);
}
int main()
{
srand(time(0));
cin >> m >> n;
for(int i = 1;i <= n;i ++)
{
cin >> a[i].w >> a[i].c;
}
for(int i = 1;i <= 50000;i ++)
{
px();
int k = m,sum = 0;
for(int j = 1;j <= n;j ++)
{
if(k >= a[j].w)
{
k -= a[j].w;
sum += a[j].c;
}
}
ans = max(ans,sum);
}
cout << ans << endl;
return 0;
}