2016 SCUT 專題訓練 簡單dp

2021-07-26 18:14:15 字數 2453 閱讀 9525

link:

從n件物品中搬走2*k 種,每次搬兩件,消耗的體力是兩手物品重量差的平方,對物品按重量排序之後,可以證明:搬相鄰重量的物品才能消耗最少,abcd四件物品重量非嚴格遞增,先搬bc再搬ad消耗的體力一定不會比先搬ab再搬cd小。很容易推出來的。

所以dp[k][n]表示從前n個物品了搬了k對物品的體力消耗最小值,

#include

#include

#include

#include

using

namespace

std;

int n,k;

int p[2005];

int dp[1005][2005];//第k對物品,前n個裡面的最小值

int main()

sort(p + 1, p + 1 + n);

for (int i = 0; i <= n; i++)

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

}printf("%d\n", dp[k][n]);

}return

0;}

因子包含2,3,5,7的數稱為humble number,要求第n個humble number。就需要地推出這個數列,具體的遞推方法見**,細節要注意。

#include

#include

#include

#include

using namespace std;

int a, b, c, d,n;

int ans[5843];

int main()

}while (scanf("%d", &n), n != 0)

else

if (m != 1 && n % 10 == 2)

else

if (m != 1 && n % 10 == 3)

else

}return

0;}

求子序列最大和,因為可能出現全為負數的情況,所以處理方法要注意資料範圍和細節。

#include

#include

#include

#include

using

namespace

std;

int n;

int num[100005];

int main()

int beg = 1, end = 1, max = -1001;

int cntbeg = 1;

int cnt = 0;

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

else

}if (cnt>max)

}printf("case %d:\n", k);

printf("%d %d %d\n", max, beg, end);

if (k < t)

}return

0;}

揹包的變種,求獲得offer的最大概率應該裝變成求沒得到offer的最小概率,計算也變得容易了,只需要簡單相乘。

#include

#include

#include

#include

using

namespace

std;

int n,v;

double p[10005];

int need[10005];

double dp[10005];

int main()

for (int i = 0; i <= v; i++)dp[i] = 1;

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

}printf("%0.1f%%\n", (1 - dp[v]) * 100);

}return

0;}

比較經典的多重揹包,用的是將每種物品的n件轉換成不同的物品。

#include

#include

#include

#include

using

namespace

std;

int n,m;

int pri[105];

int wei[105];

int many[105];

//int used[105];

int dp[105];//前n個物品

int main()

int ans = 0;

memset(dp, 0, sizeof(dp));

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

}for (int k = m; k >= cntn*pri[i]; k--)

}printf("%d\n", dp[m]);

}return

0;}

2016sdau課程練習專題二 1001

1.題目編號 2.簡單題意 輸入幾個數y,每個y要求在0 100之間找出乙個數x滿足方程 8 x 4 7 x 3 2 x 2 3 x 6 y,如果找不到,輸出 no solution 3.解題思路 使用二分法,分別在範圍內找到該範圍的中間數,然後比較得該數在哪個小範圍中,再縮小那個小範圍,直到找到該...

2016sdau課程練習專題二 1005

1.題目編號 2.簡單題意 一輛汽車要過彎,現在給出汽車的車長和車寬,問能否順利通過 3.思路 乙個物理問題的 演算法,公式為h l sin z z tan z d cos z 演算法是三分演算法,因過是長度因角度改變而變,4.感想 雖然公式知道但並不能正確寫出演算法來,因此就蒙了 5.includ...

2016sdau課程練習專題三 1001

1.題目編號 2.簡單題意 給你一組數,求出最大的子串行的和,並說出起始位置 3.解題思路 該題目要求求出最大的子串行的和,因此要找出此組數中最大的連續子串行,前i項中只要大於0就可以加入子串行,若後續數字的和也大於0則繼續相加,直到求出最大值,同時在相加過程中,記錄數字位置 4.感想 上課老師講的...