/**
* poj1732 背包问题
* 乍一看还以为是DFS题,照着DFS做了一遍发现超时了
* 仔细一分析,哦,dfs是指数级的复杂度,怎么可能不超时呢,还是按DP的方法来做吧
*
*/
#include <cstdio>
#include <cstring>
const int MAX_NUM = 100001;
int min(const int a, const int b){
return a>b ? b : a;
}
int n,m;
int count;
int dp_lastcoin[MAX_NUM];
int dp_lastcoinleft[MAX_NUM];
bool ifexist[MAX_NUM];
int input[101];
int coin_num[101];
int main(){
scanf("%d%d",&n,&m);
while(n!=0||m!=0){
count = 0;
memset(dp_lastcoinleft,0,sizeof(dp_lastcoinleft));
memset(dp_lastcoin,0,sizeof(dp_lastcoin));
memset(ifexist,0,sizeof(ifexist));
for(int i=0;i<n;++i){
scanf("%d",&input[i]);
}
for(int i=0;i<n;++i){
scanf("%d",&coin_num[i]);
}
int pre;
ifexist[0] = true;
int max_exist = 0;
for(int i=0;i<n;++i){
for(int j=input[i];j <= min(m,max_exist+input[i]*coin_num[i]);++j){
pre = j - input[i];
if(!ifexist[j] && ifexist[pre] && !(dp_lastcoin[pre] == i && dp_lastcoinleft[pre] == coin_num[i])){
++count;
ifexist[j] = true;
max_exist = (j > max_exist) ? j : max_exist;
dp_lastcoin[j] = i;
if(dp_lastcoin[pre] == i){
dp_lastcoinleft[j] = dp_lastcoinleft[pre] + 1;
}
else{
dp_lastcoinleft[j] = 1;
}
}
}
}
printf("%d\n",count);//except for count = 0
scanf("%d%d",&n,&m);
}
return 0;
}
poj1732 DP
最新推荐文章于 2017-06-04 16:21:17 发布