POJ 1276 Cash Machine DP(多重背包化01背包)

来源:互联网 发布:可以编写c语言的软件 编辑:程序博客网 时间:2024/06/06 00:37

题意: 现在需要价格总额为cash的钱,有version种面值的钱币,每种钱币的数目为amount,面值为denomination,求解在小于或等于所需价格总额的情况下所能组成的最大价值总和.
题解:每一种货币面值乘以系数1,2,4,...,2^(k-1), amount-2^k+1,且 k 是满足amount-2^k+1>0的最大整数。例如,如果amout为13,就将面值分别乘以系数1,2,4,6的得到四个值。然后将多重背包转化为01背包。

#include <iostream>using namespace std;int dp[100005], c[10001];int main(){int cash, version, denomination, amount;while ( cin >> cash ){int i, j, temp, k = 0;cin >> version;for ( i = 0; i < version; i++ ){cin >> amount >> denomination;j = 1;while ( j <= amount ){c[k] = j * denomination;amount -= j;j = j * 2;k++;}if ( amount > 0 )c[k++] = amount * denomination;}memset ( dp, 0, sizeof(dp) );for ( i = 0; i < k; i++ ){for ( j = cash; j >= c[i]; j-- ){temp = dp[j-c[i]] + c[i];if ( temp > dp[j] )dp[j] = temp;}}cout << dp[cash] << endl;}return 0;}


原创粉丝点击