初見安~這裡是傳送門:洛谷p1489 貓狗大戰
乙個挺冷門的題啊……也蠻有意思的。
把n個數劃分成兩部分,讓兩部分的數的總和的差值盡量小。
其實一眼dp,但是要往正解的方向去想是有點點難度的——明顯我們確定乙個集合,另乙個集合也就可以確定了。思考暴力一點的做法:如果我們可以列舉乙個集合的所有可能性,是不是就可以解出這個題了?換言之,我們要處理出這n個數可以湊出哪些數值。同時,在題目的「一半人數」的要求下,我們dp的兩維,乙個是人數,乙個數數值。這很明顯就是乙個01揹包了。完結。
#include#include#include#include#include#include#define maxn 205
using namespace std;
typedef long long ll;
int read()
while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
return x * f;
}int n, a[maxn], sum = 0;
bool dp[maxn][8005];
signed main()
printf("%d %d\n", sum - (sum + ans) / 2, (sum + ans) / 2);
return 0;
}
下面是解法二——
如果思路糾結於劃分方案呢?似乎就算是在確定了兩個集合人數的情況下我們主動列舉方案的複雜度也有點高。所以考慮化主動為被動——在確定了方案的情況下比較,如何?也就是隨機化演算法。我們用到乙個隨機函式random_shuffle(begin, end),作用是打亂乙個陣列內的元素,我們就不斷打亂我們劃分方案的陣列,取最優解即可。
rand的次數建議是通過時間複雜度上限進行計算,最多1.5e5,其實5e5就夠了:)
上**——
#include#include#include#include#include#include#define maxn 205
using namespace std;
typedef long long ll;
int read()
while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
return x * f;
}int n, num[maxn], ans1 = 99999999, ans2 = -99999999;
bool pt[maxn];
signed main()
printf("%d %d\n", min(ans1, ans2), max(ans1, ans2));
return 0;
}
題意挺經典的,但是解法很有意思~
迎評:)
——end——
洛谷P1489 貓狗大戰(布林DP)
傳送門 很新穎的乙個布林dp,我們用dp i j 表示選i個人能否構成j的血量 注意,是 能否 也就是說dp存的是乙個邏輯變數。首先考慮一些細節,對於偶數的n,那麼兩個部隊人數肯定是i 2,對於奇數,為i 2 向下取整 和i 2 1 考慮如何進行狀態轉移,dp i j dp i j dp i 1 j...
洛谷P1489 貓狗大戰(布林DP)
傳送門 很新穎的乙個布林dp,我們用dp i j 表示選i個人能否構成j的血量 注意,是 能否 也就是說dp存的是乙個邏輯變數。首先考慮一些細節,對於偶數的n,那麼兩個部隊人數肯定是i 2,對於奇數,為i 2 向下取整 和i 2 1 考慮如何進行狀態轉移,dp i j dp i j dp i 1 j...
kaggle貓狗大戰
kaggle貓狗大戰 kaggle上的貓狗大戰,即對貓狗的分類 沒有特徵資料,只有,所以只能運用神經網路對其訓練 看了大量的kaggle上的公開例子,大多運用tensorflow或者keras建立神經網路,因為最近在學習torch,因此,想用torch建立卷積神經網路進行建模 但整個過程遇到了很多坑...