社区讨论

求助,WA最后一个点

P5020[NOIP 2018 提高组] 货币系统参与者 20已保存回复 29

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
29 条
当前快照
1 份
快照标识符
@mi8671m3
此快照首次捕获于
2025/11/21 09:17
4 个月前
此快照最后确认于
2025/11/21 09:59
4 个月前
查看原帖
明显的DP动态规划

80分,求助!

CPP
#include<bits/stdc++.h> 
using namespace std;

const int MAXN = 200 + 5; 

int dp[MAXN][MAXN];
int w[MAXN],s[MAXN],t[MAXN];
//    重量     体积     价值 
int n,m,v,he=0;
bool b[MAXN][MAXN][MAXN]={false};//pop[i][j][k]表示第i个物品在j重力k阻力是放不放 

inline int read(){
    int f = 1, x = 0;
    char c = getchar();

    while (c < '0' || c > '9')
    {
        if (c == '-')
            f = -1;
        c = getchar();
    }

    while (c >= '0' && c <= '9')
    {
        x = x * 10 + c - '0';
        c = getchar();
    }

    return f * x;
}

void out(int wei,int sum,int now){
    //bool ok = b[now][sum][wei];

    if(now == 1){
        if(b[now][sum][wei]){
            cout<<now<<" ";
        } 
        return;
    }

    if(b[now][sum][wei]){
        out(wei - w[now],sum - s[now],now - 1);
        cout<<now<<" ";
    }else{
        out(wei,sum,now - 1);
    }
    
    return;
}

int main(){
    m = read(),v = read();
    n = read();
    for(int i = 1;i <= n; i++){
    	w[i] = read(),s[i] = read(),t[i] = read();	
    } 

    for(int i = 1;i <= n; i++){
        for(int j = m;j >= w[i]; j--){
            for(int k = v;k >= s[i]; k--){
            	int num = dp[j - w[i]][k - s[i]] + t[i];
            	
                if(dp[j][k] < num){
                    dp[j][k] = num;
                    
                    b[i][j][k] = true;
                }
            }
        }
    }

    cout<<dp[m][v]<<"\n";

    out(m,v,n);
    return 0;
}

回复

29 条回复,欢迎继续交流。

正在加载回复...