[ACW]01背包问题

题目链接

tips:

  1.状态表示f(i,j):集合:(所有选法;条件);属性(max,min,数量)

  2.状态计算,集合划分:不重不漏

  3.隐含在符号,记号之后的内涵,表示的问题

Q:fij的j不能从j=v[i]开始取进行计算,j从它上面和左前计算过来,左前不存在,还有上面存在。

/*
#include<iostream>

using namespace std;

const int maxn=1010;
int n,m;
int v[maxn],w[maxn];
int f[maxn][maxn];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    //全局变量默认是0
//    for(int j=0;j<=v;j++){
//        f[0][j]=0;
//    }
    for(int i=1;i<=n;i++){
        for(int j=v[i];j<=m;j++){//这里错误的解释??
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<f[n][m]<<endl;
    return 0;
}
*/

#include<iostream>

using namespace std;

const int maxn=1010;
int n,m;
int v[maxn],w[maxn];
int f[maxn][maxn];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    //全局变量默认是0
//    for(int j=0;j<=v;j++){
//        f[0][j]=0;
//    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            f[i][j]=f[i-1][j];
            if(j>=v[i])
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<f[n][m]<<endl;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/SUMaywlx/p/12193477.html