a[i]为第i个物品的容积,dp[i][j]表示为前i个物品容积和为j的方法数,dp[0][0]----dp[n][0]均初始化为1。 前i个物品容积和为j的方法数 = 前i-1个物品容积和为j-a[i]的方法数 + 前i-1个物品容积和为j的方法数(即算上当前容积a[i]和不算当前容积) 列出方程:dp[i][j] = dp[i-1][j-a[i]] + dp[i-1][j] 考虑到j-a[i]可能小于零,因此应该加入判定条件 改为: if (j - a[i] >= 0) dp[i][j] = dp[i-1][j-a[i]] + dp[i-1][j]; else dp[i][j] = dp[i-1][j]; 代码如下 #include <iostream> using namespace std; /*2.7 1761*/ long long dp[205][405], a[205]; int main() { int i, j, n; cin >> n; dp[0][0] = 1; for (i = 1; i <= n; i++) { cin >> a[i]; dp[i][0] = 1; } for (i = 1; i <= n; i++) { for (j = 0; j <= 400; j++) { if (j - a[i] >= 0) dp[i][j] = dp[i-1][j-a[i]] + dp[i-1][j]; else dp[i][j] = dp[i-1][j]; } } cout << dp[n][40]; return 0; }
OpenJudge 2.7 1757 神奇的口袋
于 2023-04-14 12:54:33 首次发布