读书人

POJ1276 Cash Machine(多重背包有关问

发布时间: 2013-09-25 11:02:58 作者: rapoo

POJ1276 Cash Machine(多重背包问题)


三种解法:多重背包转化为完全背包和01背包;多重背包通过二进制化化为01背包;通过计数法优化为2重循环。


code1: 47MS

#include <cstdio>#include <cstring>int main(){    int i, j, cash, n, v[15], nums[15];    int opt[100010];    int cnt[100010];    while(~scanf("%d%d",&cash,&n)) {        for(i=0; i<n; ++i)            scanf("%d%d",&nums[i],&v[i]);        for(i=0; i<=cash; ++i)            opt[i] = 0;        for(i=0; i<n; ++i) {            memset(cnt, 0, sizeof(int)*(cash+1));            for(j=v[i]; j<=cash; ++j) {                if(opt[j] <opt[j-v[i]]+v[i]&&cnt[j-v[i]]<nums[i]) {                    cnt[j] = cnt[j-v[i]]+1;                    opt[j] = opt[j-v[i]] + v[i];                }            }        }        printf("%d\n",opt[cash]);    }    return 0;}



读书人网 >编程

热点推荐