首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

POJ1276 Cash Machine(多重背包有关问题)

2013-09-25 
POJ1276 Cash Machine(多重背包问题)三种解法:多重背包转化为完全背包和01背包;多重背包通过二进制化化为0

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;}



热点排行