#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include<fstream>
using namespace std;
#define N 500
struct Bag
{
int id;
int w;
int v;
double wv;
};
int C,n,Wsum,Vsum,best;
struct Bag bag[N];
int tempans[N],ans[N];
int cmp(const void *a,const void *b)
{
struct Bag *c = (Bag *) a;
struct Bag *d = (Bag *) b;
return c->wv<d->wv?1:-1;
};
double shangjie(int x)
{
double tmp = Vsum;
double left = C-Wsum;
while(x<n&&bag[x].w<=left)
{
tmp+=bag[x].v;
left-=bag[x].w;
x++;
}
if(x<n)
{
tmp+=left*bag[x].wv;
}
return tmp;
}
void dfs(int x)
{
if(x>=n)
{
if(Vsum>best)
{
best = Vsum;
for(int i = 0; i<n; i++)
ans[bag[i].id]=tempans[bag[i].id];
}
return;
}
if(Wsum+bag[x].w<=C)
{
Wsum+=bag[x].w;
Vsum+=bag[x].v;
tempans[bag[x].id]=1;
dfs(x+1);
Wsum-=bag[x].w;
Vsum-=bag[x].v;
}
if(shangjie(x+1)>best)
{
tempans[bag[x].id]=0;
dfs(x+1);
}
}
int main()
{
freopen("d:/2.in","r",stdin);
scanf("%d %d",&C,&n);
best = 0;
Wsum=0;
Vsum=0;
memset(ans,0,sizeof(ans));
memset(tempans,0,sizeof(tempans));
int tempV= 0, tempW =0;//物品的全部重量与全部价值
for(int i = 0; i<n; i++)
{
scanf("%d %d",&bag[i].w,&bag[i].v);
bag[i].id=i;
bag[i].wv = bag[i].v*1.0/bag[i].w;
printf("%d %d\n",bag[i].w,bag[i].v);
tempV += bag[i].v;
tempW += bag[i].w;
}
if(tempV<=C) //如果全部重量小于能承载的重量 那么全选
{
printf("%d\n",tempW);
for(int i = 0; i<n; i++)
printf("%d 1\n",i+1);
return 0;
}
qsort(bag,n,sizeof(bag[0]),cmp); //按单位重量的价排序值
/*for(int i = 0; i<n; i++)
{
printf("%d %d %d\n",bag[i].id,bag[i].w,bag[i].v);
}*/
dfs(0);
printf("%d\n",best);
for(int i = 0; i<n;i++)
printf("%d %d\n",i+1,ans[i]);
}
01背包之深度优先搜索法
最新推荐文章于 2023-02-23 20:52:08 发布