受教了。这个题目是本人第一次做分组背包,比较失败。连题意带条件搞错了几个地方,最终悲剧的wa了4次。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node1{
int heng;
int zong;
int w;
int v;
};
int num[205];
node1 point[205];
int cost[205][205];
int value[205][205];
int dp[50005];
bool cmp(node1 a,node1 b)
{
int x1=a.heng;
int y1=a.zong;
int x2=b.heng;
int y2=b.zong;
if(y1*x2==y2*x1)
return y1<y2;
return y1*x2<y2*x1;
}
int maxi(int x,int y)
{
if(x>y)
return x;
else return y;
}
int main()
{
int n,t,i,flag,j,k,test;
test=0;
while(cin>>n>>t)
{
test=test+1;
for(i=1;i<=n;i++)
{
cin>>point[i].heng>>point[i].zong>>point[i].w>>point[i].v;
}
sort(point+1,point+1+n,cmp);
for(i=0;i<=t;i++)
dp[i]=0;
memset(num,0,sizeof(num));
num[1]=1;
cost[1][1]=point[1].w;
value[1][1]=point[1].v;
flag=1;
for(i=2;i<=n;i++)
{
if(point[i].heng*1.0/point[i].zong==point[i-1].heng*1.0/point[i-1].zong)
{
num[flag]=num[flag]+1;
cost[flag][num[flag]]=cost[flag][num[flag]-1]+point[i].w;
value[flag][num[flag]]=value[flag][num[flag]-1]+point[i].v;
}
else {
flag=flag+1;
num[flag]=num[flag]+1;
cost[flag][num[flag]]=cost[flag][num[flag]-1]+point[i].w;
value[flag][num[flag]]=value[flag][num[flag]-1]+point[i].v;
}
}
for(i=1;i<=flag;i++)
{
for(k=t;k>=0;k--)
for(j=1;j<=num[i];j++)
if(k>=cost[i][j])
dp[k]=maxi(dp[k],dp[k-cost[i][j]]+value[i][j]);
}
cout<<"Case "<<test<<": "<<dp[t]<<endl;
}
return 0;
}