zoukankan      html  css  js  c++  java
  • Charm Bracelet

    Description

    Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charms. Each charm i in the supplied list has a weight Wi (1 ≤ Wi ≤ 400), a 'desirability' factor Di (1 ≤ Di ≤ 100), and can be used at most once. Bessie can only support a charm bracelet whose weight is no more than M (1 ≤ M ≤ 12,880).

    Given that weight limit as a constraint and a list of the charms with their weights and desirability rating, deduce the maximum possible sum of ratings.

    Input

    * Line 1: Two space-separated integers: N and M
    * Lines 2..N+1: Line i+1 describes charm i with two space-separated integers: Wi and Di

    Output

    * Line 1: A single integer that is the greatest sum of charm desirabilities that can be achieved given the weight constraints

    Sample Input

    4 6
    1 4
    2 6
    3 12
    2 7

    Sample Output

    23

    大意:在一共M大的背包里面放N件东西,计算这N件东西的最大价值,很基础的背包问题,即在第二个for循环中从背包的最大容量开始,因为背包可以有剩余,然后减少,用递归,dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    const int maxn = 222222;
    int w[maxn],v[maxn],dp[maxn];
    int main(){
        int n,m;
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&n,&m);
        for(int i = 1; i <= n ; i++)
            scanf("%d%d",&w[i],&v[i]);
            for(int i = 1; i <= n ; i++){
                    for(int j = m; j >= w[i];j--){
                            dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
                    }
            }
            printf("%d",dp[m]);
    }
    View Code

     二维实现,不过会超时

    1

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int dp[4000][15000];
    int w[4000],v[4000];
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m)){
            for(int i = 1; i <= n; i++)
                scanf("%d%d",&w[i],&v[i]);
            memset(dp,0,sizeof(dp));
            for(int i = 1; i <= n ; i++){
                for(int j = 0; j <= m ;j++){
                    if(j >= w[i])
                        dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
                    else dp[i][j] = dp[i-1][j];
                }
            }
            printf("%d
    ",dp[n][m]);
        }
        return 0;
    }
    View Code

    dp[i][j]代表的是重量小于等于j的最大价值

    2.

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int dp[4000][15000];
    int w[4000],v[4000];
    const int inf = 0x3f3f3f3f;
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m)){
            for(int i = 1; i <= n; i++)
                scanf("%d%d",&w[i],&v[i]);
            for(int i = 0; i <= n ; i++){
                for(int j = 0 ; j <= m ;j++){
                    dp[i][j] = -inf;
                }
            }
            dp[0][0] = 0;
            for(int i = 1; i <= n ; i++){
                for(int j = 0; j <= m ;j++){
                    if(j >= w[i])
                        dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
                    else dp[i][j] = dp[i-1][j];
                }
            }
            int max1 = -inf ;
            for(int i = 0; i <= m; i++)
                max1 = max(max1,dp[n][i]);
            printf("%d
    ",dp[n][m]);
        }
        return 0;
    }
    View Code

     dp[i][j]表示重量恰好为j的最大价值




  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4313189.html
Copyright © 2011-2022 走看看