典型的背包问题.对于每组积木跑一个背包,然后全盘跑一遍找到最大的值使得每组积木都有相应的值
要存n组积木,由于n<=100,并且每组最多只有100个积木,每个最长不超过100,故用dp[100][10000]存储可以通过
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 1e2+5; int n,ans; bool dp[MAXN][MAXN*MAXN]; inline void update(int curr, int num){ for (int i=MAXN*MAXN-2;i>=0;i--){//倒叙跑背包 if (i-num<0) return; if (dp[curr][i-num]) dp[curr][i] = true; } } inline void solve(){ cin >> n; memset(dp,0,sizeof(dp)); for (int i=0;i<n;i++){ int c; cin >> c; dp[i][0] = true;//拿0个肯定可以 while(c!=-1){ update(i,c); cin >> c; } } for (int i=0;i<MAXN*MAXN;i++){ for (int j=0;j<n;j++) if (!dp[j][i]) goto abcd; ans = i; abcd:; }//从大到小会快,不过无所谓了... cout << ans; } int main(){ solve(); return 0; }
来源:https://www.cnblogs.com/DannyXu/p/12536347.html