动态规划:有限集的最值/个数问题
(1)状态表示(化零为整)
有限集中的最值集合
属性:max,min,count
(2)状态计算(化整为零)
划分子集依据:寻找最后一个不同点
注意:1、不重复(求数量时)ps:求最大值.....可以重复
2、不遗漏
01背包问题
eg:
//朴素算法
//暴力解法
#include<iostream>
using namespace std;
const int N=1010;
int n,m;
int V[N],W[N];
int f[N][N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>V[i]>>W[i];
}
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];//左半边的子集
/*当选择1~i个物品,总体积不大于j的集合的最大值可以转化
成选择1~i-1个物品,总体积不大于j-V[i]的集合+最后一个物
品的价值:f[i-1][j-V[i]]+w[i] */
if(j>=V[i]) f[i][j]=max(f[i][j],f[i-1][j-V[i]]+W[i]);
}
}
cout<<f[n][m]<<endl;
return 0;
}