@Acqua
2019-01-20T01:53:40.000000Z
字数 1087
阅读 996
动态规划
想以优雅强迫症的方式放置本厚度的书籍,书籍宽度不一定相等,但高度一致。放不下的书可以放在所有书的顶上,但是要保证顶上的书的总宽度不超过书架宽度。求能放下书[1])的最小书架宽度。

表示放第本书时,厚度总和为,宽度总和为时的情况是否成立。
// La Pluie#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N = 100 + 5;int dp[N][N << 1][N << 1], t[N], w[N];int main(){int n;scanf("%d", &n);int T = 0, W = 0;for(int i = 1; i <= n; i++){scanf("%d %d", &t[i], &w[i]);T += t[i]; W += w[i];}dp[0][0][0] = 1;for(int i = 1; i <= n; i++){for(int j = 0; j <= T; j++){for(int k = 0; k <= min(W, 200); k++){if(j >= t[i]) dp[i][j][k] |= dp[i - 1][j - t[i]][k];if(k >= w[i]) dp[i][j][k] |= dp[i - 1][j][k - w[i]];}}}int ans = 200;for(int i = 1; i <= n; i++){for(int j = 0; j <= T; j++){for(int k = 0; k <= min(W, 200); k++){if(k > j) break;if(dp[n][j][k]) ans = min(ans, max(j, k));}}}printf("%d", ans);return 0;}