TLE #9 #10 WA #10 的过来
查看原帖
TLE #9 #10 WA #10 的过来
1091709
Cloud_Ivy37楼主2024/9/10 11:35

TLE #9 #10:

//动态规划-二维
#include<iostream>
using namespace std;
const int N=1e4+5;  
int n,m,t[N],v[N];
int dp[N][N];
//dp[i][j]:在前i个物品中选择,并且它们的时间和为j,的价值的集合
//性质:max
//状态计算:
//不选:dp[i][j]=dp[i-1][j];
//选择:(1 2 3 k ...)
//     dp[i][j]=dp[i-1][j-k*t[i]]+k*v[i];
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++) cin>>t[i]>>v[i];
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            for(int k=0;k*t[i]<=j;k++){
                dp[i][j]=max(dp[i][j],dp[i-1][j-k*t[i]]+k*v[i]);
            }
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

二维优化成一维后发现 WA #10:

//动态规划-一维
#include<iostream>
using namespace std;
const int N=1e7+5;  
int n,m,t[N],v[N];
int dp[N];
//dp[j]:在前n个物品中选择,并且它们的时间和为j,的价值的集合
//性质:max
//状态计算:
//不选:dp[j]=dp[j];
//选择:(1 2 3 k ...)
//     dp[j]=dp[j-t[i]]+v[i];
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++) cin>>t[i]>>v[i];
    for(int i=1;i<=n;i++){
        for(int j=t[i];j<=m;j++){
            dp[j]=max(dp[j],dp[j-t[i]]+v[i]);
        }
    }
    cout<<dp[m]<<endl;
    return 0;
}

最后开了浪浪发现 AC:

//动态规划-一维
#include<iostream>
#define int long long
using namespace std;
const int N=1e7+5;  
int n,m,t[N],v[N];
int dp[N];
//dp[j]:在前n个物品中选择,并且它们的时间和为j,的价值的集合
//性质:max
//状态计算:
//不选:dp[j]=dp[j];
//选择:(1 2 3 k ...)
//     dp[j]=dp[j-t[i]]+v[i];
signed main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++) cin>>t[i]>>v[i];
    for(int i=1;i<=n;i++){
        for(int j=t[i];j<=m;j++){
            dp[j]=max(dp[j],dp[j-t[i]]+v[i]);
        }
    }
    cout<<dp[m]<<endl;
    return 0;
}
2024/9/10 11:35
加载中...