• 洛谷 P1048 采药 01背包入门


    P1048 采药 

    最近想学dp了

    一道非常简单入门的01背包,写此博客做一个教训,对01背包还不是特别熟,动态方程很容易就推出来了,但是写二维状态方程时wa了,然后改为一维过了。

    主要还是对01背包不熟悉。

    dp[i][j] 表示用 j 单位时间采前 i 种药草的最大价值。

    dp[i][j] = max( dp[i-1][j-e[i].t] + e[i].w , dp[i-1][j])

    但是当 j < e[i].t 时,dp[i][j] = dp[i-1][j] ,。。。就是wa在这儿。

    二维代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N=200;
    const int T=1e3+100;
    int t, m;
    struct node{
    	int t, w;
    }e[N];
    
    int dp[N][T];
    int main(){
    	cin >> t >> m;
    	for(int i = 1; i <= m ; i++){
    		cin >> e[i].t >> e[i].w;
    	}
    
    	dp[0][0] = 0;
    	for(int i = 1; i <= m; i++){
    		for(int j = 0; j <= t; j++){
    			if(j >= e[i].t)dp[i][j] = max(dp[i-1][j-e[i].t] + e[i].w,dp[i-1][j]);
    			else dp[i][j] = dp[i-1][j];
    		}
    	}
    	
    	cout << dp[m][t] << endl;
    	return 0;
    }
    

      一维代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N=200;
    const int T=1e4+100;
    int t, m;
    struct node{
        int t, w;
    }e[N];
    
    int dp[T];
    int main(){
        cin >> t >> m;
        for(int i = 1; i <= m ; i++){
            cin >> e[i].t >> e[i].w;
        }
    
        dp[0] = 0;
        for(int i = 1; i <= m; i++){
            for(int j = t; j >= e[i].t; j--){
                dp[j] = max(dp[j-e[i].t] + e[i].w,dp[j]);
            }
        }
        
        cout << dp[t] << endl;
        return 0;
    }
    

      

      

  • 相关阅读:
    装饰器函数
    二分查找
    jmter 二次开发 IDEA 项目5.1
    python 测试框架nose
    pycharm 参数、快捷键、调试模式
    IDea 工具debug模式详细使用说明
    MySQL zip安装
    adb 设备命令
    兰亭集序 王羲之
    adb 命令实用
  • 原文地址:https://www.cnblogs.com/YJing814/p/11193680.html
Copyright © 2020-2023  润新知