poj 1276 Cash Machine

来源:互联网 发布:spss数据差异性分析 编辑:程序博客网 时间:2024/05/29 19:27

题目大意:

有一个容量一定的背包,具有不同价值的货币且有数量限制,问背包中最多能有多少价值的货币;

解题思路:

多重背包,用二进制进行优化,代码简单,方便,为什么用二进制可以转换成0-1背包做呢?这是因为这几种状态可以组合出所有状态,然后0-1背包即可;
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 100010int main(){int m,n;while(~scanf("%d%d",&m,&n)){int k=0;int dp[maxn]={0};int cost[110],val[110];for(int i=0;i<n;i++){int a,b;scanf("%d%d",&a,&b);int j=1;while(j<a){val[++k]=j*b;cost[k]=j*b;a-=j;j<<=1;}val[++k]=a*b;cost[k]=a*b;}for(int i=1;i<=k;i++)for(int j=m;j>=cost[i];j--)dp[j]=max(dp[j],dp[j-cost[i]]+val[i]);printf("%d\n",dp[m]);}} 


0 0
原创粉丝点击