c語言演算法—01揹包問題(一維表達形)
阿新 • • 發佈:2019-01-01
經過上次我們用基礎的演算法解決了揹包問題之後,現在我們來看另外一種演算法:通過一維陣列表達;
其實,在上次我們使用二維陣列時可以發現,我們在從上往下建立(橫向建立)的時候,資料是一行一行成型的,而新的資料是在原先一排舊的基礎上更新形成的,所以,我們來想,我們其實並不需要儲存舊的資料,而可以直接在同一個位置上進行資料的更新,永遠只儲存新的位置上的資料;
如果這樣的話,我們就只需要一個m+1長的一維陣列了。
#include<Stdio.h>
#include<string.h>
#include<malloc.h>
#define max(a,b)(a>b? a:b)
int n,m;
int main()
{
scanf("%d%d",&m,&n);
int *a=(int *)malloc(sizeof(int)*(m+1));
memset(a,0,sizeof(int)*(m+1));
for(int i=1;i<=n;++i)
{
int w,p;
scanf("%d%d",&w,&p);
for(int j=m;j>=0;--j)
{
if(j-w>=0)
a[j]=max(a[j],a[j-w]+p);
}
}
printf ("%d",a[m]);
return 0;
}
在這個程式碼中,一定要注意,一維陣列的建立一定是逆序建立的,即j一定是逆序的。