01背包问题,要求能否填满整个背包,由于要求出那几张牌丢失,所以不能使用滚动数组..
这种情况下把dp[0][0]置0,其他的置为无穷小,再进行普通的01背包.
如果dp[N][TotalW] != TotalW那么说明没有解.
再判断是否dp[i][TotalW- W[i]] + W[i] == TotalW,如果是那么就可以通过第i张牌和前面i - 1张牌中的某几张牌组成totalW,如果有多个这样的i,那么就说明有多个解
求出01背包后,逆推求出被选择的那几张牌.
如果dp[i][j] == dp[i - 1][j] 说明第i张牌没有被选择,否则就是选择了.
非常综合的题目.
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
const int MAX = 100010;
in