PKU 3624 0-1背包

题意:标准的0-1背包问题。内存方面使用滚动数组。时间方面可以先对W[]进行非升排序。本来在输入数据时候还打算记录最小重量,在knap时候进行优化,但发现结果没有什么变量,所以并没有加上。

 

C++源码:

#include <iostream> using namespace std; const int N = 3402; const int M = 12881; short w[N], v[N]; int t[M]; int n, c; void swap(int i, int j){ int tmp = w[i]; w[i] = w[j]; w[j] = tmp; tmp = v[i]; v[i] = v[j]; v[j] = tmp; } void quickSort(int lo, int hi){ if(lo>=hi) return; int pivot = w[hi]; int i=lo-1; int j=hi; while(i<j){ while(w[++i]>pivot); while(j>=0 && w[--j]<pivot); if(i<j) swap(i,j); } swap(i,hi); quickSort(lo,i-1); quickSort(i+1,hi); } void readin(){ cin >> n >> c; for(int i=0;i<n;i++) cin >> w[i] >> v[i]; } void knap(){ quickSort(0,n-1); int little = w[n-1] > c ? c : w[n-1]; for(int i=0;i<little;i++) t[i] = 0; for(int i=little;i<=c;i++) t[i] = v[n-1]; for(int i=n-2;i>=0;i--){ for(int j=c;j>=0;j--){ if(w[i]<=j) t[j]=max(t[j],t[j-w[i]]+v[i]); else break; } } } int main(){ readin(); knap(); cout << t[c] << endl; return 0; }

 

运行:

C++编译

memory: 248K

time: 344MS

code: 1140B

 

总结:

1、最近做的题虽然很基础,不过想把简单的问题彻底弄懂。而且比较关注内存和时间方面的优化,毕竟AC不是目的,目的是能够学到更多的东西。Status上好多人的算法都是50MS以内,以后多思考一些优化方法。

2、quickSort虽然写了好多次,但是还是手生,经常搞错一点,要加强基础算法学习。

你可能感兴趣的:(c,优化,算法,ini,PIVOT)