动态规划-完全背包-一维数组

动态规划-完全背包

洛谷 P2722

 https://www.luogu.com.cn/problem/P2722

#include<iostream>
using namespace std;
int x,y;
//t每种类型需要时间 p每种类型获得分数 
int t[10002],p[10002];
//前i种题目,tj时间内获得分数 
int dp[10002];
int main(){
    int m,n;
    cin>>m>>n;//m竞赛时间 n是指题目种类 
    for(int i=1;i<=n;i++){
        //pi i类题获得分数 ti 类题花费时间 
        cin>>p[i]>>t[i]; 
    }
    for(int i=1;i<=n;i++){
        //前i种种类,j时间内获得最大分数
        //每种类可以多次累加,比如只有一种时 
        //i=1 j=8 t[1]=4  dp[8]=dp[4]+p[1]  --dp[4]即为p[1] 
        for(int j=t[i];j<=m;j++){
               dp[j]=max(dp[j],dp[j-t[i]]+p[i]);
        }
    }
    //dp[m] m时间内所有种类获得最大分数 
    cout<<dp[m];
    return 0;
}

 

洛谷 P1616

 https://www.luogu.com.cn/problem/P1616

#include <bits/stdc++.h>
using namespace std;
//t用来采药的时间 m山洞里草药的种类 
int t,m;
//采第i种草药需要的时间和价值 
int a[10002], b[10002];
//前i种采药 j时间内采药最大的价值
long long dp[10000002];
int main(){
    scanf("%d %d", &t,&m);
    for(int i=1; i <=m; i++) {
        scanf("%d %d", &a[i], &b[i]);    
    }    
    for(int i = 1; i <= m; i++){
        //前i种采药 j时间内采药最大的价值
        for(int j = a[i]; j <= t; j++) {
            //加入价值变大则加入 
            dp[j] = max(dp[j],dp[j-a[i]] + b[i]);
        }    
    }
    //所有种类草药 t时间内采药的最大价值 
    printf("%lld", dp[t]);
    return 0;
}

 

posted @ 2021-05-01 20:59  new-code  阅读(119)  评论(0)    收藏  举报