【boj1395】【求改贴】Cash Machine 多重背包 本地数据一致但是提交WA

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 200000
#define INFN 20
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct Machine{
	int n;
	int D;
};

struct Machine mac[INF];
int F[INF];
int N;
int cash;

int solve(int N,int cash){
	memset(F,0,sizeof(F));
	for(int i=1;i<=N;i++){
		if(mac[i].n*mac[i].D>=cash){
			for(int v=mac[i].D;v<=cash;v++){
				F[v]=max(F[v],F[v-mac[i].D]+mac[i].D);
			}	
		}else{
			int k=1;
			while(k<=mac[i].n){
				for(int v=cash;v>=mac[i].D;v--){
					F[v]=max(F[v],F[v-k*mac[i].D]+k*mac[i].D);
				}
				mac[i].n=mac[i].n-k-1;
				k=2*k;
			}
			for(int v=cash;v>=mac[i].D;v--){
				F[v]=max(F[v],F[v-mac[i].D*mac[i].n]+mac[i].D*mac[i].n);
			}
		}
	}
	return F[cash];
}

int main(int argc, char** argv) {
	while(~scanf("%d%d",&cash,&N)){
		memset(mac,0,sizeof(mac));
		for(int i=1;i<=N;i++){
			scanf("%d%d",&mac[i].n,&mac[i].D);
		}
		if(cash==0||N==0){
			printf("%d\n",0);
			continue;
		}
		printf("%d\n",solve(N,cash));
	}
	return 0;
}


你可能感兴趣的:(ACM,求改贴,boj1395)