168 条题解

  • 0
    @ 2007-07-29 23:23:48

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    简单二维背包!!

  • 0
    @ 2007-07-29 22:59:50

    普通搜……

  • 0
    @ 2007-07-29 22:48:03

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2007-07-29 20:15:57

    这次拖鞋啊

  • 0
    @ 2007-07-29 19:58:42

    多开一维限制条件

  • 0
    @ 2007-07-29 20:01:39

    双限制背包..

    2维数组就可以完成了

  • -1
    @ 2016-11-03 15:39:28

    贴一个纯天然未优化,思路看起来明显的。。。话说同等时空复杂度下C/C++貌似比Pascal快那么一些些

    
    #include <iostream>
    #include <fstream>
    
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    const int maxv = 400 + 10;
    const int maxn = 50 + 10;
    
    int dp[maxn][maxv][maxv];
    int u[maxn], v[maxn], w[maxn];
    
    int main() 
    {
    #ifdef LOCAL
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
    
        int U, V; cin >> U >> V;
        int N; cin >> N;
        
        for (int i = 1; i <= N; ++i) cin >> u[i] >> v[i] >> w[i];
    
        for (int i = 1; i <= N; ++i) 
            for (int j = 1; j <= U; ++j) for (int k = 1; k <= V; ++k) 
                dp[i][j][k] = max(dp[i-1][j][k], (j >= u[i] && k >= v[i]) ? dp[i-1][j-u[i]][k-v[i]] + w[i] : dp[i-1][j][k]);
            
        int ans = 0;
        for (int i = 1; i <= U; ++i) for (int j = 1; j <= V; ++j) if (dp[N][i][j] >= ans)
            ans = dp[N][i][j];
    
        cout << ans << endl;
        return 0;
    }
    
  • -1
    @ 2016-09-10 22:26:26
    #include <iostream>
    #include <algorithm>
    using namespace std;
    struct {
        int v,m,c; //v为食物占用的体积,m为食物占用的重量,c为食物卡路里数
    } item[55]; //存储每个食物的信息
    int maxv,maxm,n,f[55][410][410]; //maxv,maxm分别为最大体积和最大质量,f[i][j][k]代表将前i个食物放入可用体积为j,可用重量为k的背包中生成卡路里数的最优解
    int main(){
        cin >> maxv >> maxm >> n;
        for(int i = 1; i <= n;i++){
            cin >> item[i].v >> item[i].m >> item[i].c; //输入每个食物的数据
        }
        for(int i = 0; i <= n;i++){
            f[i][0][0] = 0;
        }
        for(int i = 0; i <= maxv;i++){
            f[0][i][0] = 0;
        }
        for(int i = 0; i <= maxm;i++){
            f[0][0][i] = 0;
        }
        //上面的三个for循环是初始化
    
       //核心代码开始
        for(int i = 1; i <= n;i++){
            for (int j = 1; j <= maxv; j++) {
                for (int k = 1; k <= maxm; k++) {
                    f[i][j][k] = max((j >= item[i].v && k >= item[i].m ? f[i-1][j-item[i].v][k - item[i].m]+item[i].c:f[i-1][j][k]),f[i-1][j][k]);
            //当且仅当第i个食物的体积小于等于j,重量小于等于k时才能被放入背包,此时需要比较到底是放了之后卡路里更大还是不放卡路里更大,如果把第i个食物放进背包,则相当于把前i-1个食物放入可用体积为j,可用重量为k的背包中,然后再把第i个食物装进去(即把第i个食物的卡路里数加上)。如果第i个食物不能够装进去,就直接用f[i-1][j][k],因为这个时候卡路里数没有发生变化
                }
            }
        }
    //核心代码结束
        cout << f[n][maxv][maxm] << endl; //输出f[n][maxv][maxm]就是这道题的解
    }
    

信息

ID
1334
难度
2
分类
动态规划 | 背包 点击显示
标签
(无)
递交数
2917
已通过
1744
通过率
60%
被复制
5
上传者