dp 数组开小了。
40 pts 代码:
//expected:100pts
#include<bits/stdc++.h>
using namespace std;
int s,n,m;
int a[110][110];
int dp[10010];
int ans;
struct node{
int id,num,cst;
double dc;
void ctdc(){
dc=1.0*cst/(num*id);
}
friend bool operator <(node a,node b){
return a.dc<b.dc;
}
}t[10010];
int cnt;
int main(){
cin>>s>>n>>m;
for(int i=1;i<=s;i++){
for(int j=1;j<=n;j++){
cin>>a[j][i];
}
}
for(int i=1;i<=n;i++){
sort(a[i]+1,a[i]+s+1);
}
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
for(int k=1;k<=s;k++){
if(j>a[i][k]*2){
dp[j]=max(dp[j],dp[j-a[i][k]*2-1]+k*i);
}
}
}
}
for(int i=1;i<=m;i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}
改成 20010 就过了:
//expected:100pts
#include<bits/stdc++.h>
using namespace std;
int s,n,m;
int a[110][110];
int dp[20010];
int ans;
struct node{
int id,num,cst;
double dc;
void ctdc(){
dc=1.0*cst/(num*id);
}
friend bool operator <(node a,node b){
return a.dc<b.dc;
}
}t[10010];
int cnt;
int main(){
cin>>s>>n>>m;
for(int i=1;i<=s;i++){
for(int j=1;j<=n;j++){
cin>>a[j][i];
}
}
for(int i=1;i<=n;i++){
sort(a[i]+1,a[i]+s+1);
}
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
for(int k=1;k<=s;k++){
if(j>a[i][k]*2){
dp[j]=max(dp[j],dp[j-a[i][k]*2-1]+k*i);
}
}
}
}
for(int i=1;i<=m;i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}