如何计算数列和的绝对值最小

fengnetman 2009-07-26 07:50:34
加精
现有一个数组,里面包含了正数和负数,取其中n个数,要求这n个数的和的绝对值是最小的!
...全文
4584 126 打赏 收藏 转发到动态 举报
写回复
用AI写文章
126 条回复
切换为时间正序
请发表友善的回复…
发表回复
fqhlysliuyansen 2012-07-16
  • 打赏
  • 举报
回复
你太搞笑了



[Quote=引用 35 楼 的回复:]

这和求最大子数列的问题的本质是一样的,在网上找吧,一大堆的解法
[/Quote]
fqhlysliuyansen 2012-07-16
  • 打赏
  • 举报
回复
哪有这么容易 的

[Quote=引用 7 楼 的回复:]

用Dp可以,本质还是一个01背包,按照5楼的方法,分成两个集合,效率应该会更好一些,有些分治的意味!
[/Quote]
fengnetman 2009-08-03
  • 打赏
  • 举报
回复
今天结贴吧,不过有些话还是要说一下。就目前Csdn的算法版,个人觉得已大不如前,几位大牛基本也无法在算法版看到了。一个帖子发出来,也基本没几个人会参与谈论,这里的种种弊端我也就不说了。还有有些人发的贴子完全就是学生的作业贴,已完全失去了意义,哎,不说了,希望Csdn能再次活跃起来吧。
这里还是很感谢积极回帖的几位!
linren 2009-08-02
  • 打赏
  • 举报
回复
上面发错地方了(汗)……
linren 2009-08-02
  • 打赏
  • 举报
回复
刚才用10989测试了一下,发现这个数在32位(10进制)下是没有解的。测试需要的时间约为1个小时。

【程序】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>

void int_to_big(char* a,int x,int len){
int i,c;
c=0;
memset(a,0,sizeof(char)*len);
for(i=0;i<len;i++){
if(x<10){
a[i]=x;return;
}
c=x%10;a[i]=c;x/=10;
}
}

void print_big(char* a){
int i,c;
c=0;
for(i=31;i>=0;i--){
if(a[i]!=0){
if(c==0) c=1;
printf("%d",a[i]);
}else{
if(c!=0) printf("0");
}
}
if(c==0) printf("0");
printf("\n");
}

void mask_to_msk(int mask,char* msk){
int i;
memset(msk,0,sizeof(char)*32);
for(i=0;i<32;i++){
if(mask&(1<<i)) msk[i]=1;
}
}
void msk_to_mask(int* mask,char* msk){
int i;
*mask=0;
for(i=0;i<32;i++) if(msk[i]==1) *mask|=(1<<i);
}

int init_mask(char* a,int* mask,char* msk){
int i,c;
char in[32];
memset(in,0,sizeof(in));
memset(msk,0,sizeof(char)*32);c=-1;
for(i=31;i>=0;i--){
if(a[i]!=0&&c==-1) c=i;
if(a[i]>1) break;
}
if(i==-1) return 1;
if(c+1==32) return -1;
msk[c+1]=1;
msk_to_mask(mask,msk);
return 0;
}

int is_answer(char* msk,int xx){
int i,j,lm;
int cc;
int b[8],d;
memset(b,0,sizeof(b));
for(i=31;i>=0;i--) if(msk[i]!=0) break;
lm=i+1;
if(lm%4==0) cc=lm/4;
else cc=lm/4+1;
for(i=0;i<cc;i++){
for(j=0;j<4;j++){
b[i]=b[i]*10+msk[i*4+3-j];
}
}
d=b[cc-1]%xx;
for(i=cc-2;i>=0;i--){
d=d*10000+b[i];
d=d%xx;
}
if(d==0){
return 1;
}
return 0;
}

unsigned prt;
void fun(int x){
char *pa,*msk;
int mask,k;
pa=(char*)malloc(sizeof(char)*32);
msk=(char*)malloc(sizeof(char)*32);

//把x转换成10进制表示,并存入pa中
memset(pa,0,sizeof(char)*32);
int_to_big(pa,x,32);

//初始化msk和mask
k=init_mask(pa,&mask,msk);
if(k==1){
printf("%d=>%d\n",x,x);
free(pa);free(msk);return;
}else if(k==-1){
printf("error!\n");
free(pa);free(msk);return;
}
//找答案
while(1){
if(is_answer(msk,x)){
printf("%d=>",x);
print_big(msk);
free(pa);free(msk);return;
}
mask++;prt=mask;
if(mask==-1){
printf("can not find in 32 bits!\n");break;
}
mask_to_msk(mask,msk);
}

free(pa);free(msk);
}


void mytimer(LPVOID sc){
unsigned myprt;
unsigned total=4294967295;
while(1){
Sleep(30000);
myprt=prt;
printf("test to: %.3f%%\n",100.0*myprt/(1.0*total));
GetTickCount();
}
}
int main(){
HANDLE thrd;
time_t t1,t2;
struct tm *pt;

thrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)mytimer,NULL,0,NULL);

time(&t1);
pt=localtime(&t1);
printf("start\t%02d:%02d:%02d\n",pt->tm_hour,pt->tm_min,pt->tm_sec);

fun(10989);
TerminateThread(thrd,NULL);

time(&t2);
pt=localtime(&t1);
printf("start\t%02d:%02d:%02d\n",pt->tm_hour,pt->tm_min,pt->tm_sec);
pt=localtime(&t2);
printf("end\t%02d:%02d:%02d\n",pt->tm_hour,pt->tm_min,pt->tm_sec);
return 0;
}


【运行结果】
start 14:25:38
test to: 0.899%
test to: 1.781%
test to: 2.665%
test to: 3.545%
test to: 4.434%
test to: 5.321%
test to: 6.204%
test to: 7.040%
test to: 7.869%
test to: 8.700%
test to: 9.526%
test to: 10.355%
test to: 11.181%
test to: 12.004%
test to: 12.830%
test to: 13.669%
test to: 14.507%
test to: 15.341%
test to: 16.178%
test to: 17.013%
test to: 17.846%
test to: 18.675%
test to: 19.508%
test to: 20.340%
test to: 21.170%
test to: 21.996%
test to: 22.827%
test to: 23.653%
test to: 24.479%
test to: 25.307%
test to: 26.149%
test to: 26.990%
test to: 27.828%
test to: 28.668%
test to: 29.509%
test to: 30.346%
test to: 31.178%
test to: 32.019%
test to: 32.857%
test to: 33.702%
test to: 34.537%
test to: 35.375%
test to: 36.209%
test to: 37.041%
test to: 37.874%
test to: 38.713%
test to: 39.549%
test to: 40.385%
test to: 41.222%
test to: 42.059%
test to: 42.893%
test to: 43.721%
test to: 44.556%
test to: 45.389%
test to: 46.222%
test to: 47.051%
test to: 47.883%
test to: 48.712%
test to: 49.535%
test to: 50.370%
test to: 51.214%
test to: 52.060%
test to: 52.904%
test to: 53.750%
test to: 54.594%
test to: 55.437%
test to: 56.275%
test to: 57.121%
test to: 57.966%
test to: 58.812%
test to: 59.652%
test to: 60.485%
test to: 61.323%
test to: 62.159%
test to: 63.000%
test to: 63.846%
test to: 64.691%
test to: 65.533%
test to: 66.376%
test to: 67.223%
test to: 68.065%
test to: 68.902%
test to: 69.743%
test to: 70.583%
test to: 71.424%
test to: 72.259%
test to: 73.095%
test to: 73.929%
test to: 74.760%
test to: 75.599%
test to: 76.442%
test to: 77.283%
test to: 78.122%
test to: 78.963%
test to: 79.803%
test to: 80.642%
test to: 81.479%
test to: 82.322%
test to: 83.161%
test to: 84.001%
test to: 84.839%
test to: 85.675%
test to: 86.509%
test to: 87.341%
test to: 88.179%
test to: 89.017%
test to: 89.855%
test to: 90.690%
test to: 91.530%
test to: 92.366%
test to: 93.197%
test to: 94.030%
test to: 94.868%
test to: 95.704%
test to: 96.538%
test to: 97.370%
test to: 98.203%
test to: 99.035%
test to: 99.869%
can not find in 32 bits!
start 14:25:38
end 15:25:13
Press any key to continue
tanwan 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 linren 的回复:]
引用 100 楼 LeonTown 的回复:
C/C++ code
#include <vector>
using namespace std;

int g_iArr[] = //{-5,-2,-1,3,5}; //原始序列
//{-5, 4, 9, 3, 6, 1};
{
-176, 412, 437, -36, 164, -33, -393, 285,
-279, -290, 217, -325, -316, 51, -377, -195,
318, -141, -277, -18, 208, 364, 364, -453,
188, -2, -45, -343, 115, -309, -303, 240,
147, -331, 318, 383, -324, 272, -253, -36,
-419, -173…
[/Quote]
这组测试案例的最小值是1?如下
【测试用例】
int g_iArr[] = {-100,49,51,-1,2,4,-5};
GetSubArr(3, num);

【测试结果】
Min Abs Sum: 1
They are:2 4 -5
Press any key to continue
应该是0吧?-100+49+51=0
java1109 2009-07-31
  • 打赏
  • 举报
回复
mark
linren 2009-07-31
  • 打赏
  • 举报
回复
(上接118楼)

【测试数据】
-176, 412, 437, -36, 164, -33, -393, 285,
-279, -290, 217, -325, -316, 51, -377, -195,
318, -141, -277, -18, 208, 364, 364, -453,
188, -2, -45, -343, 115, -309, -303, 240,
147, -331, 318, 383, -324, 272, -253, -36,
-419, -173, -392, -213, -55, 119, -50, 1,
-96, 467, 127, 106, -221, -40, 222, 300,
143, -125, -76, 468, -13, -199, 269, -417,
-361, -487, 152, -195, -409, 119, 5, 61,
-114, -484, -438, 384, 229, -321, 106, -213,
480, -174, 113, -29, -330, -24, -312, -376,
212, -55, -287, -386, 458, 300, 103, -155,
262, 312, 80, 56, -314, 428, -132, 357,
-458, 308, -272, -233, -115, -60, -285, -454,
147, -115, 89, -397, 47, 161, -233, -249,
-60, -180, -260, 98, -232, -273, -162, 361,
255, -406, -225, 367, -481, -223, -141, -461,
-264, -106, 289, -358, 40, -231, 430, -432,
286, -253, -8, 438, -142, -80, 495, -176,
155, 267, -51, 332, -67, 275, 142, 374,
143, 39, 442, 374, 428, 398, -471, 201,
-63, 121, -45, 125, -397, -314, -64, 47,
-439, -327, 294, 316, -167, 312, -60, -112,
-35, 211, -180, 131, -245, -207, -284, 33,
-271, 486, -184, 120, -465, 179, 461, -156

【测试结果】
n=1: |SUM|=1
n=2~189: |SUM|=0
n=190: |SUM|=177 (timeout)
n=191: |SUM|=616 (timeout)
n=192: |SUM|=1069 (timeout)
n=193: |SUM|=1523 (timeout)
n=194: |SUM|=1981 (timeout)
n=195: |SUM|=2442 (timeout)
n=196: |SUM|=2907 (timeout)
n=197: |SUM|=3378
n=198: |SUM|=3859
n=199: |SUM|=4343
n=200: |SUM|=4830
linren 2009-07-31
  • 打赏
  • 举报
回复
【思路】
利用求近似解的思路优化枚举数组,这样比单纯的按绝对值排序得到的效果要好上很多

【程序】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
/***只用替换这里*****************/
#define ASIZE 200
int a[ASIZE]={-176, 412, 437, -36, 164, -33, -393, 285,
-279, -290, 217, -325, -316, 51, -377, -195,
318, -141, -277, -18, 208, 364, 364, -453,
188, -2, -45, -343, 115, -309, -303, 240,
147, -331, 318, 383, -324, 272, -253, -36,
-419, -173, -392, -213, -55, 119, -50, 1,
-96, 467, 127, 106, -221, -40, 222, 300,
143, -125, -76, 468, -13, -199, 269, -417,
-361, -487, 152, -195, -409, 119, 5, 61,
-114, -484, -438, 384, 229, -321, 106, -213,
480, -174, 113, -29, -330, -24, -312, -376,
212, -55, -287, -386, 458, 300, 103, -155,
262, 312, 80, 56, -314, 428, -132, 357,
-458, 308, -272, -233, -115, -60, -285, -454,
147, -115, 89, -397, 47, 161, -233, -249,
-60, -180, -260, 98, -232, -273, -162, 361,
255, -406, -225, 367, -481, -223, -141, -461,
-264, -106, 289, -358, 40, -231, 430, -432,
286, -253, -8, 438, -142, -80, 495, -176,
155, 267, -51, 332, -67, 275, 142, 374,
143, 39, 442, 374, 428, 398, -471, 201,
-63, 121, -45, 125, -397, -314, -64, 47,
-439, -327, 294, 316, -167, 312, -60, -112,
-35, 211, -180, 131, -245, -207, -284, 33,
-271, 486, -184, 120, -465, 179, 461, -156};
/********************************/

int compar(const void *a,const void *b){
int *x=(int*)a;
int *y=(int*)b;
if(*x>*y) return 1;
if(*x==*y) return 0;
return -1;
}

struct level{
int *now;
int len;
};

void add(struct level *llv,int n){
int i=0;
llv->len=n;
llv->now=(int*)malloc(sizeof(int)*n);
memset((char*)(llv->now),0,sizeof(int)*n);
for(i=0;i<n;i++){
llv->now[i]=i;
}
}

void del(struct level *llv){
free(llv->now);
}

int timeout;
void mytimer(LPVOID sc){
int seconds;
seconds=(*(int*)sc)*1000;
Sleep(seconds);
timeout=0;
}

void fun(int *array,int size,int n,unsigned int seconds){
HANDLE thrd;
int i,j,k;
int x,y,u,v,o;
int z,z2;
int *a;
int *b;
int *c;
char *mask;
struct level p;
if(size<=0||size<n||n<=0){
printf("size<=0||size<n||n<=0 error!\n");return;
}

a=(int*)malloc(sizeof(int)*size);
b=(int*)malloc(sizeof(int)*n);
c=(int*)malloc(sizeof(int)*size);
mask=(char*)malloc(sizeof(char)*size);
memcpy(a,array,sizeof(int)*size);
memset(b,0,sizeof(int)*n);
memset(c,0,sizeof(int)*size);
memset((char*)&p,0,sizeof(struct level));

qsort(a,size,sizeof(int),compar);
if(a[0]>=0){
printf("array error: array need <0 number\n");
free(mask);free(c);free(b);free(a);return;
}
if(a[size-1]<=0){
printf("array error: array need >0 number\n");
free(mask);free(c);free(b);free(a);return;
}

timeout=1;
thrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)mytimer,(LPVOID)&seconds,0,NULL);

if(n==1){
for(i=0;i<size;i++){
if(i==0){
z=abs(a[i]);b[0]=a[0];continue;
}
z2=abs(a[i]);
if(z>z2){
z=z2;b[0]=a[i];
}
}
}
else if(n==size){
z2=0;
for(i=0;i<n;i++){
b[i]=a[i];z2+=a[i];
}
z=abs(z2);
}
else if(n<=size/2){
/**找一个近似解并且优化枚举数组***********************************/
o=1;
for(i=0;i<size;i++){
if(a[i]>=0){
y=i;break;
}
}
x=y-1;z2=0;
for(i=0;i<size;i++){
if(x>=0&&y<size){
u=a[x]+z2;
v=a[y]+z2;
if(abs(u)<abs(v)){
z2=u;
if(i==n-1){
z=abs(z2);b[i]=a[x];
}
else if(i<n-1) b[i]=a[x];
c[i]=a[x];x--;
continue;
}else{
z2=v;
if(i==n-1){
z=abs(z2);b[i]=a[y];
}
else if(i<n-1) b[i]=a[y];
c[i]=a[y];y++;
continue;
}
}
if(x>=0){
z2=a[x]+z2;
if(i==n-1){
b[i]=a[x];z=abs(z2);
}
else if(i<n-1) b[i]=a[x];
c[i]=a[x];x--;
continue;
}else{
z2=a[y]+z2;
if(i==n-1){
b[i]=a[y];z=abs(z2);
}
else if(i<n-1) b[i]=a[y];
c[i]=a[y];y++;
continue;
}
}
/***********************************找一个近似解并且优化枚举数组**/
if(z>0){
/**选择****************/
add(&p,n);
while(timeout){
z2=0;
for(i=0;i<n;i++){
z2+=c[p.now[i]];
}
z2=abs(z2);
if(z>z2){
z=z2;
for(i=0;i<n;i++) b[i]=c[p.now[i]];
if(z==0) break;
}
if(p.now[p.len-1]==size-1){
for(i=1,j=p.len-2;j>=0;j--,i++){
if((p.now[j])<(size-1-i)) break;
}
if(j<0) break;
p.now[j]++;
k=p.now[j]+1;
for(i=j+1;i<p.len;i++) p.now[i]=k++;
}else{
p.now[p.len-1]++;
}
}
/****************选择**/
}
}
else{
/**找一个近似解并且优化枚举数组***********************************/
o=1;
for(i=0;i<size;i++){
if(a[i]>=0){
y=i;break;
}
}
x=y-1;z2=0;
for(i=0;i<size;i++){
if(x>=0&&y<size){
u=a[x]+z2;
v=a[y]+z2;
if(abs(u)<abs(v)){
z2=u;
if(i==n-1){
z=abs(z2);b[i]=a[x];
}
else if(i<n-1) b[i]=a[x];
c[i]=a[x];x--;
continue;
}else{
z2=v;
if(i==n-1){
z=abs(z2);b[i]=a[y];
}
else if(i<n-1) b[i]=a[y];
c[i]=a[y];y++;
continue;
}
}
if(x>=0){
z2=a[x]+z2;
if(i==n-1){
b[i]=a[x];z=abs(z2);
}
else if(i<n-1) b[i]=a[x];
c[i]=a[x];x--;
continue;
}else{
z2=a[y]+z2;
if(i==n-1){
b[i]=a[y];z=abs(z2);
}
else if(i<n-1) b[i]=a[y];
c[i]=a[y];y++;
continue;
}
}
memset(a,0,sizeof(int)*size);
for(i=0;i<size;i++) a[i]=c[size-i-1];
/***********************************找一个近似解并且优化枚举数组**/
if(z>0){
/**排除****************/
add(&p,size-n);
while(timeout){
memset(mask,0,sizeof(char)*size);
for(i=0;i<size-n;i++) mask[p.now[i]]=1;
z2=0;
for(i=0;i<size;i++) if(mask[i]==0) z2+=a[i];
z2=abs(z2);
if(z>z2){
z=z2;j=0;
for(i=0;i<size;i++) if(mask[i]==0) b[j++]=a[i];
if(z==0) break;
}
if(p.now[p.len-1]==size-1){
for(i=1,j=p.len-2;j>=0;j--,i++){
if((p.now[j])<(size-1-i)) break;
}
if(j<0) break;
p.now[j]++;
k=p.now[j]+1;
for(i=j+1;i<p.len;i++) p.now[i]=k++;
}else{
p.now[p.len-1]++;
}
}
/**排除****************/
}
}

printf("n=%d:\n",n);
if(timeout) printf("[");
else printf("time out! the best test answer find in %d seconds is:\n[",seconds);
for(i=0;i<n-1;i++){
printf("%d, ",b[i]);
}
printf("%d], |SUM|=%d\n",b[i],z);
TerminateThread(thrd,NULL);
del(&p);free(mask);free(c);free(b);free(a);
}

void main(){
int i;
for(i=1;i<=ASIZE;i++) fun(a,ASIZE,i,10);
}

【运行结果】
大部分情况都找到最优解了,超时的只有以下几种情况:
n=190: |SUM|=177
n=191: |SUM|=616
n=192: |SUM|=1069
n=193: |SUM|=1523
n=194: |SUM|=1981
n=195: |SUM|=2442
n=196: |SUM|=2907
这些超时的答案和LeonTown所求的答案是一样的

fengnetman 2009-07-31
  • 打赏
  • 举报
回复
你的方法类似LeonTown的,看100楼的代码。这个已经发现有问题了。见103楼
现在提供一个新的想法:首先去着手求各个数之间的差值(两两之间),再根据差值来获得结果
tanwan 2009-07-31
  • 打赏
  • 举报
回复
我41楼回答的大家看看额...
1,-2,5,31,32,33,-96 这组数据我说的好象能过~~~
linren 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 113 楼 LeonTown 的回复:]
可能这道题,
不能简单的使用传统方法
[/Quote]

的确是很有可能

推荐一个很好的题:
彩票N保M缩水问题(最小集合覆盖问题)
这个问题虽然没有经过推荐不过的确是很不错
LeonTown 2009-07-31
  • 打赏
  • 举报
回复
而且,上述的错误例子,
都是答案集中在数列的两端
LeonTown 2009-07-31
  • 打赏
  • 举报
回复
可能这道题,
不能简单的使用传统方法
LeonTown 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 111 楼 linren 的回复:]
引用 107 楼 LeonTown 的回复:
如果在我的基础上,
先对数列按绝对值,做一下从小到大的排序,
会有效果吗?


还是有一些问题……
int g_iArr[] ={1,-2,5,31,32,33,-96};
GetSubArr(3, num);
Min Abs Sum: 31
They are:32 33 -96
Press any key to continue

答案是:
n=3:
[1, -2, 5], |SUM|=4
Press any key to continue
[/Quote]

那针对这个case,
把遍历顺序,改为从前向后,
呵呵。。。
linren 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 107 楼 LeonTown 的回复:]
如果在我的基础上,
先对数列按绝对值,做一下从小到大的排序,
会有效果吗?
[/Quote]
还是有一些问题……
int g_iArr[] ={1,-2,5,31,32,33,-96};
GetSubArr(3, num);
Min Abs Sum: 31
They are:32 33 -96
Press any key to continue


答案是:
n=3:
[1, -2, 5], |SUM|=4
Press any key to continue
LeonTown 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 109 楼 linren 的回复:]
引用 107 楼 LeonTown 的回复:
如果在我的基础上,
先对数列按绝对值,做一下从小到大的排序,
会有效果吗?



的确是有效果!
[/Quote]

也只是对上述两个错误的例子。
不知道,还有没有其它错误的例子。。。
linren 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 107 楼 LeonTown 的回复:]
如果在我的基础上,
先对数列按绝对值,做一下从小到大的排序,
会有效果吗?
[/Quote]

的确是有效果!
linren 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 104 楼 LeonTown 的回复:]
嗯,是有问题。
谢谢!
[/Quote]
这个算法在求近似解上的实力真的很强
如果两者能整合在一起就好了……

[Quote=引用 105 楼 fengnetman 的回复:]
确实,向前取最小的时候是有问题,疏忽了。看来还得继续讨论
[/Quote]
感觉上有可能的确是NP难问题……
LeonTown 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 106 楼 linren 的回复:]
(上接103楼)
【一个新的测试用例】
int g_iArr[] ={-96,31,32,33,1,-2,5};
GetSubArr(4, num);
Min Abs Sum: 35
They are:31 1 -2 5
Press any key to continue

答案应该是:
[33, 32, 31, -96], |SUM|=0
[/Quote]

如果在我的基础上,
先对数列按绝对值,做一下从小到大的排序,
会有效果吗?
加载更多回复(106)
为什么人人都要学算法? 程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点。很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法,觉得算法深不可测。但是这些其实都不是具体的算法,而是一系列算法的集合。 所以说,好的代码从来离不开优秀的算法!算法不学不可! 本门课程为系列课程第一课,挑选出非常实用、高效、高频的算法:动态规划! 动态规划(Dynamic programming,简称DP)很多人都觉得是比较难以理解和掌握的一种算法,为了应付面试更多的时候程序员会选择直接死记硬背斐波那楔数列或者背包问题的源码,其实只要认真学习、彻底理解,动态规划并没有那么难。 学完即可掌握面试中90% 以上会问到的算法问题 ,实用性99.9999%! 这门课程,授课老师很厉害! 王硕-资深软件工程师,从事计算机相关课程教学多年,擅长Java、Python、数据结构和算法等课程,有丰富的计算机课程的教学经验。致力于企业级软件开发和计算机教育工作,具有索尼中国研究院和四大国有银行软件开发中心的工作经历。 著有编程畅销书《你也能看得懂的Python算法书》。 本课程实用性极强,边学边练!零基础也能轻松入门~ 在这门课中,我们保证你能收获到这些 1)透彻理解:到底什么是动态规划 2)细致讲解:挖矿工问题 3)细致讲解:爬台阶问题 4)细致讲解:背包问题 【注意】 1)现在购买至少享受40元优惠;2)课程教辅材料自助下载; ---------------------------------------------------------------

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧