#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX 1000
struct node
{
int w, v; //背包的价值和体积
int leap;
};
int c, n; //背包容量和物品个数
int bestw, cw, cv;
int w, v;
node data[MAX];
int compare( node a, node b )
{
if( (1.0*a.w/a.v - 1.0*b.w/b.v) <=0 )
return 0;
return 1;
}
float best_value(int i)
{
int cp_c = c - cv;
int j = i; //是否是i+1 我觉得还是 i+1 老师是否写错了呢
float sum = 0.0;
while( j < n && data[j].v <=cp_c )
{
cp_c -= data[j].v;
sum += data[j].w;
j ++;
}
if(j < n && data[j].v > cp_c)
{
sum += 1.0*cp_c*data[j].w/data[j].v;
}
return sum;
}
void dfs(int i)
{
if( i >= n )
{
if( cw > bestw )
bestw = cw;
for(int i=0; i<n; i++)
if(data[i].leap) printf("%d %d ",data[i].w, data[i].v );
putchar(10);
return;
}
else if( cv + data[i].v <= c )
{
cv += data[i].v;
cw += data[i].w;
data[i].leap = 1; //选取这个物品
dfs(i+1);
cv -= data[i].v;
cw -= data[i].w;
data[i].leap = 0;
}
else if(best_value(i) >= bestw) //不选这个物品
dfs(i+1);
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
bestw = cw = 0;
scanf("%d %d",&c, &n);
for(int i=0; i<n; i++)
{
scanf("%d %d", &data[i].w, &data[i].v);
data[i].leap = 0;
}
sort(data, data+n, compare);
dfs(0);
printf("%d\n",bestw);
}
system("pause");
return 0;
}
0 1 背包 回溯版
最新推荐文章于 2022-05-15 16:19:51 发布