0 1 背包 回溯版

来源:互联网 发布:mac粉色系口红 编辑:程序博客网 时间:2024/06/06 00:26
#include <cstdio>#include <cstdlib>#include <iostream>#include <string>#include <algorithm>#include <vector>using namespace std; #define MAX 1000struct 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;}