1.背包dp
1.0-1 背包 2.完全背包 3.多重背包 4.二进制分组优化
5.单调队列优化 6.混合背包 7.二维费用背包 8.分组背包
9.有依赖的背包 10.泛化物品的背包 11.杂项小优化 12.背包问题变种
13.输出方案求方案数 14.求最优方案总
1.01-背包(滚动数组优化后的)
// C++ Version
for (int i = 1; i <= n; i++)
for (int l = W; l >= w[i]; l--) f[l] = max(f[l], f[l - w[i]] + v[i]);
2.完全背包(已优化)
// C++ Version
for (int i = 1; i <= n; i++)
for (int l = 0; l <= W - w[i]; l++)
f[l + w[i]] = max(f[l] + v[i], f[l + w[i]]);
// 由 f[i][l + w[i]] = max(max(f[i - 1][l + w[i]],f[i - 1][l] + w[i]),f[i][l +
// w[i]]); 简化而来
求dp数组中大于大于0的数量
ans = count_if(dp+1,dp+1+m,bind2nd(greater_equal<int>(),0));
3.多重背包
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[110], c[110],n,m;
int dp[100010];
int main(){
while(scanf("%d %d",&n,&m)&&n){
memset(dp,-1,sizeof(dp));
for(int i = 0; i < n; i ++)scanf("%d",&a[i]);
for(int i = 0; i < n; i ++)scanf("%d",&c[i]);
dp[0]=0;