sicily 1750. 运动会

#include<iostream>        //分组背包问题
#include <stdio.h>
#include<cstring>
using namespace std;
struct node
{
int val,cost;
}table[102][102];
int D[102],E[102],M[102],len[102];
int dp[1002];
int main()
{
int cases;
cin>>cases;
while(cases--)
{
int P,N;
cin>>P>>N;
for(int i=0;i<N;++i)
cin>>D[i]>>E[i]>>M[i];
table[0][0].val=M[0];
table[0][0].cost=E[0];
len[0]=1;
int cur=0;
for(int i=1;i<N;++i)
{
if(D[i]!=D[i-1])
{
cur++;
table[cur][0].val=M[i];
table[cur][0].cost=E[i];
len[cur]=1;
}
else
{
int& rear=len[cur];
table[cur][rear].val=M[i];
table[cur][rear].cost=E[i];
rear++;
}
}
memset(dp,0,sizeof(dp));
for(int i=0;i<=cur;++i)
{
for(int j=P;j>=0;--j)
{
//一直WA的原因! 注意这句.题目有可能E为0,
//那么dp[j-table[i][k].cost]=dp[j],值已经被改变了
//网上有说用二维的就OK,一维的就WA,应该是这个原因吧.
int t=dp[j];

for(int k=0;k<len[i];++k)
{
if(j>=table[i][k].cost)
{
t=max(t,dp[j-table[i][k].cost]+table[i][k].val);
}
}
dp[j]=t;
}
}
cout<<dp[P]<<endl;
}
return 0;
}

posted on 2012-03-26 20:14  sysu_mjc  阅读(225)  评论(0编辑  收藏  举报

导航