POJ 1742 多重部分和解法

2021-09-11 08:48:21 字數 1167 閱讀 2964

多重部分和,常規dp超時

超時思路 : 列舉每一種硬幣,如果合理則bool陣列為1

超時**:

#include#include#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

bool dp[105][100005];

int main()

return 0;

}

嘗試使用了一維滾動陣列進行空間優化

但是發無論怎樣結果都等於m,究其原因是因為未對硬幣數目進行有效的控制,導致同一種硬幣無限列舉

wa**:

#include#include#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

bool dp[100005];

int main()

return 0;

}

參閱白書,看到了另一種優化,同樣化為一維陣列,但是不是bool陣列,用int陣列儲存當前硬幣剩餘數目,這樣同時實現了空間和時間的優化(把第三維的列舉優化到了int陣列的數值中),原來一開始就被誤導用了bool陣列啊。。

排除一切不合理,剩下的就是合理啦

ac**:

#include#include#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

int dp[100005];

int main()

int ans = 0;

for(int i = 1; i <= m; i ++)

if(dp[i] >= 0) ans ++;

printf("%d\n", ans);

}return 0;

}

POJ 1742多重揹包問題

include include include include includeusing namespace std define maxn 105 define maxl 100005 int weight maxn c maxn f maxl user maxl int main printf ...

poj 1742 多重揹包(單調佇列)

如題 又是這道題 第一種方法是二進位制拆分多重揹包 能過hdu2488 見我這一篇 第二種是為了減小時間複雜度,通過改變dp策略 能過poj1742 不能過杭電 這裡說第三種,多重揹包的0 vn 複雜度演算法。使用了單調佇列。這位大牛寫的很清楚 也就是找出狀態轉移方程中的重複狀態,然後將容量拆成v拆...

POJ1742 動態規劃 多重揹包

題意 問多重部分和能否恰好等於m。思路 dp i j 用前i種面額硬幣湊成j後,第i種硬幣最多剩下的個數,若湊不成則為 1.可優化空間複雜度。反思 想不出應該如此定義dp陣列。include using namespace std int a 100 10 int c 100 10 int dp 1...