#include <iostream>#define MAX 1002using namespace std;struct node { int num; int sv; }dp[MAX];struct nodeData { int value; int w; }data[MAX];int n,c,t;void Init() { int i; scanf("%d%d",&n,&c); for(i=1;i<=n;i++) scanf("%d%d",&data[i].value,&data[i].w); }int GetMin(int a,int b) { if(a>b) return b; else return a; }void Knapsack() { int i,j; for(i=0;i<data[n].w;i++) //初始化 { dp[i].sv=0; dp[i].num=0; } for(;i<=c;i++) { dp[i].sv=data[n].value; dp[i].num=1; } for(i=n-1;i>=1;i--) for(j=c;j>=data[i].w;j--) //for(j=m;j>=data[i].w;j--)也可以 { if(j>=data[i].w) { int temp=dp[j-data[i].w].sv+data[i].value,tNum=dp[j-data[i].w].num; if(dp[j].sv<temp) { dp[j].sv=temp; dp[j].num=tNum+1; } else if(dp[j].sv==temp) { dp[j].num=GetMin(dp[j].num,tNum+1); } } } printf("%d %d\n",dp[c].sv,dp[c].num); }int main() { scanf("%d",&t); while(t--) { Init(); Knapsack(); } return 0; }
转载于:https://www.cnblogs.com/forever4444/archive/2009/05/08/1452890.html
相关资源:0-1背包问题需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。