这是本来我写的100分但是hack数据没过的代码:
#include <iostream>
#include <vector>
using namespace std;
struct node{
vector<int> p;
vector<int> v;
int number;
};
int n,m,o;
node a[61];
int dp[61][32001];
int main(){
cin>>n>>m;
for(int i=1;i<=m;++i){
int x,y,z;
cin>>x>>y>>z;
if(z==0){
o++;
a[o].p.push_back(x);
a[o].v.push_back(x*y);
a[o].number=i;
}else{
for(int j=1;j<=o;++j){
if(a[j].number==z){
a[j].p.push_back(x);
a[j].v.push_back(x*y);
break;
}
}
}
}
for(int i=1;i<=o;++i){
for(int j=1;j<=n;++j){
int f1,f2,f3,f4,f5;
f1=f2=f3=f4=f5=0;
f1= dp[i-1][j];
if(j-a[i].p[0]>=0) f2= dp[i-1][j-a[i].p[0]]+a[i].v[0];
if(j-a[i].p[0]-a[i].p[1]>=0) f3= dp[i-1][j-a[i].p[0]-a[i].p[1]]+a[i].v[0]+a[i].v[1];
if(j-a[i].p[0]-a[i].p[2]>=0) f4= dp[i-1][j-a[i].p[0]-a[i].p[2]]+a[i].v[0]+a[i].v[2];
if(j-a[i].p[0]-a[i].p[1]-a[i].p[2]>=0) f5=dp[i-1][j-a[i].p[0]-a[i].p[1]-a[i].p[2]]+a[i].v[0]+a[i].v[1]+a[i].v[2];
dp[i][j]=max(max(max(max(f1,f2),f3),f4),f5);
}
}
int Max=1;
for(int i=2;i<=o;++i){
if(dp[Max][n]<dp[i][n])
Max=i;
}
cout<<dp[Max][n];
}
这是我之后hack数据过了,但是只得了30分的代码(哭):
#include <iostream>
#include <vector>
using namespace std;
struct node{
vector<int> p;
vector<int> v;
int number;
};
int n,m,o,k;
node a[61];
int dp[61][32001];
int save[61][3];
int main(){
cin>>n>>m;
for(int i=1;i<=m;++i){
int x,y,z;
cin>>x>>y>>z;
if(z==0){
o++;
a[o].p.push_back(x);
a[o].v.push_back(x*y);
a[o].number=i;
}else{
++k;
save[k][0]=x;
save[k][1]=y;
save[k][2]=z;
}
}
for(int j=1;j<=o;++j){
for(int i=1;i<=k;++i){
if(a[j].number==save[k][2]){
a[j].p.push_back(save[k][0]);
a[j].v.push_back(save[k][0]*save[k][1]);
break;
}
}
}
for(int i=1;i<=o;++i){
for(int j=1;j<=n;++j){
int f1,f2,f3,f4,f5;
f1=f2=f3=f4=f5=0;
f1= dp[i-1][j];
if(j-a[i].p[0]>=0) f2= dp[i-1][j-a[i].p[0]]+a[i].v[0];
if(j-a[i].p[0]-a[i].p[1]>=0) f3= dp[i-1][j-a[i].p[0]-a[i].p[1]]+a[i].v[0]+a[i].v[1];
if(j-a[i].p[0]-a[i].p[2]>=0) f4= dp[i-1][j-a[i].p[0]-a[i].p[2]]+a[i].v[0]+a[i].v[2];
if(j-a[i].p[0]-a[i].p[1]-a[i].p[2]>=0) f5=dp[i-1][j-a[i].p[0]-a[i].p[1]-a[i].p[2]]+a[i].v[0]+a[i].v[1]+a[i].v[2];
dp[i][j]=max(max(max(max(f1,f2),f3),f4),f5);
}
}
int Max=1;
for(int i=2;i<=o;++i){
if(dp[Max][n]<dp[i][n])
Max=i;
}
cout<<dp[Max][n];
}
在此本蒟蒻向各位dalao求助! Orz