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.感想 上課老師講的...