1. 程式人生 > >c語言演算法—01揹包問題(一維表達形)

c語言演算法—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一定是逆序的。