zoukankan      html  css  js  c++  java
  • 完全背包问题

    【题目描述】

    设有nn种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为MM,今从nn种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于MM,而价值的和为最大。

    【输入】

    第一行:两个整数,MM(背包容量,M200M≤200)和NN(物品数量,N30N≤30);

    2..N+12..N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。

    【输出】

    仅一行,一个数,表示最大总价值。

    【输入样例】

    10 4
    2 1
    3 3
    4 5
    7 9

    【输出样例】

    max=12

    递推实现:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxm=201,maxn = 31;
    int m,n;
    int w[maxn],c[maxn];
    int f[maxn][maxm];
    int main()
    {
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    cin>>w[i]>>c[i];
    for(int i=1;i<=n;i++)
    for(int v=1;v<=m;v++)
    if(v<w[i]) f[i][v]=f[i-1][v];
    else
    if(f[i-1][v]>f[i][v-w[i]]+c[i]) f[i][v]=f[i-1][v];
    else f[i][v]=f[i][v-w[i]]+c[i];
    cout<<"max="<<f[n][m]<<endl;
    return 0;
    }

    递归实现

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 31;
    #define INF (1<<30)
    int vis[maxn], d[maxn];
    int v[maxn], w[maxn];
    int n;

    int dp(int i)
    {
    int & ans = d[i];
    if (ans != -1)
    return ans;
    ans = -INF;
    for (int j = 1; j <=n; j++)
    {
    if (i >= v[j])
    {
    ans = max(ans, dp(i - v[j]) + w[j]);
    }

    }
    return ans;
    }

    int main()
    {
    int c=0;
    cin >>c>> n;

    for (int i = 1; i <=n; i++)
    cin >> v[i] >> w[i];
    memset(vis,0,sizeof(vis));
    memset(d, -1, sizeof(d));
    d[0] = 0;
    cout<<"max="<<dp(c)<<endl;
    return 0;
    }

    递归实现是有错误的,能得80%的正确率。思考为什么??

    边界问题是一定的,极限情况:每一种情况输入的内容为0要排除掉

    第二种情况,如果输入

    1 2

    4 5

    6 7

    所有的情况不能装得下,怎么办?上面的递归没有对if中的else情况进行判断

    第三个问题是数组开得太小。

    改进如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 201;
    #define INF (1<<30)
    int vis[maxn], d[maxn];
    int v[maxn], w[maxn];
    int n,flag;

    int dp(int i)
    {
    int & ans = d[i];
    if (ans != -1)
    return ans;
    ans = -INF;
    for (int j = 0; j <n; j++)
    {
    if (i >= v[j])
    {
    ans = max(ans, dp(i - v[j]) + w[j]);
    flag=1;
    }

    }
    if(flag==0) ans=0;
    return ans;
    }
    int main()
    {
    int c=0;
    cin >>c>> n;
    if(c==0||n==0) {
    cout<<"max=0"<<endl;
    return 0;
    }
    for (int i = 0; i <n; i++)
    cin >> v[i] >> w[i];
    memset(vis,0,sizeof(vis));
    memset(d, -1, sizeof(d));
    d[0] = 0;
    cout<<"max="<<dp(c)<<endl;
    return 0;
    }

  • 相关阅读:
    Hadoop实战课程
    R语言实战读书笔记(七)基本统计分析
    R语言实战读书笔记(六)基本图形
    python-unexpected content storage modification出错
    python——no module named XX
    R语言实战读书笔记(五)高级数据管理
    R语言缺失值信息处理
    R语言,NA,NAN
    R语言实战读书笔记(四)基本数据管理
    R语言实战读书笔记(三)图形初阶
  • 原文地址:https://www.cnblogs.com/macren/p/11089199.html
Copyright © 2011-2022 走看看