POJ 1742

男人八題之一,多重揹包可行性探討,也算對當時揹包問題多重揹包部分學習的首尾,具體算法可以見崔天翼關於多重揹包可行性O(VN)的算法,不過,據說可以利用隊列優化,不過嘗試了下,由於沒有一個參考,不太明白優化的意思時間反而超了,所以暫時作罷

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <deque>
using namespace std;

const int maxn= 105;
const int maxm= 1e5+5;

int a[maxn], c[maxn];
int dv[maxm];

int main(int argc, char const *argv[])
{
	int n, m;
	while (2== scanf("%d %d", &n, &m) && n){
		for (int i= 1; i<= n; ++i){
			scanf("%d", a+i);
		}
		for (int i= 1; i<= n; ++i){
			scanf("%d", c+i);
		}

		for (int j= 1; j<= m; ++j){
			dv[j]= -1;
		}
		dv[0]= 0;

		for (int i= 1; i<= n; ++i){
			for (int j= 0; j<= m; ++j){
				if (dv[j]>= 0){
					dv[j]= c[i];
				}
				else{
					dv[j]= -1;
				}
			}
			int co= a[i];
			int uj= m-co;
			for (int j= 0; j<= uj; ++j){
				if (dv[j]> 0){
					dv[j+co]= max(dv[j+co], dv[j]-1);
				}
			}
		}

		int ans= 0;
		for (int j= 1; j<= m; ++j){
			if (dv[j]>= 0){
				++ans;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章