poj 1276 Cash Machine

原创 2011年01月24日 12:32:00

题目是多重背包问题

按传统的DP三重循环,时间复杂度太大,一直TLE

背包问题九讲中有个好办法,就是把多重背包编程01背包,边的过程中最个优化,使复杂度降低(具体见背包问题九讲)

 

 

//转来的代码

#include <iostream>

using namespace std;

int a[15][2];
int dp[120001];
int value[1001];

int main()
{
int cash, n;
while (cin >> cash >> n)
{
int i;
int k = 0;
for (i = 0; i < n; ++i)
{
cin >> a[i][0] >> a[i][1];
int j = 1;
while (j <= a[i][0])
{
value[k++] = a[i][1] * j;
a[i][0] -= j;
j *= 2;
}
if (a[i][0] > 0)
value[k++] = a[i][1] * a[i][0];
}
memset(dp,0,sizeof(dp));
for (i = 0; i < k; ++i)
for (int j = cash; j >= 0; --j)
{
if (j - value[i] >= 0)
dp[j] = dp[j] > dp[j-value[i]] + value[i] ? dp[j] : dp[j-value[i]] + value[i];
}
cout << dp[cash] << endl;
}
return 0;
}

还有种方法是在DP中加入强剪枝,减小搜索范围,自己试了好久一直TLE 悲剧啊。

 

#include <iostream>
#include
<cstdio>
#include
<cmath>
#include
<algorithm>
using namespace std;


struct node
{

    
int num;
    
int value;

}
a[15];




bool dp[100001];
int cash,N;


int main ()
{
    
int i,j,k;
    
while(scanf("%d%d",&cash,&N)!=EOF)
    
{


        memset(dp,
0,sizeof(dp));
        
for(i=1;i<=N;i++)
            scanf(
"%d%d",&a[i].num,&a[i].value);
        
if (cash==0||N==0)
        
{
            printf(
"0/n");
            
continue;
        }


        
int max=0;
        dp[
0]=true;
        
for(i=1;i<=N;i++)
        
{
            
if(a[i].value>cash)
                
continue;
            
for(j=max;j>=0;j--)
            
{
                
if(dp[j]==true)
                
for(k=1;k<=a[i].num;k++)
                
{
                

                    
{
                        
int temp=j+k*a[i].value;
                        
if(temp>cash)
                            
break;
                        
if(temp>max)
                        
{
                            max
=temp;
                            
                        }

                        dp[temp]
=true;
                    }

                }

            }

        }

        printf(
"%d/n",max);

    }

    
return 0;
}

 

北大POJ1276-Cash Machine

  • 2012年05月11日 02:09
  • 2KB
  • 下载

poj1276 Cash Machine

题意: 735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10 第一行的...

POJ 1276Cash Machine(多重背包 + 二进制优化)

题目大概意思是酱紫的    先给你两个数字 第一个代表目标金钱 第二个代表钞票的种类  (我这么理解的) 然后在给你n组数据 分别代表  某种面值的钞票有多少多少张 由于之前做过类似的题目 就没...
  • Tdyh_NY
  • Tdyh_NY
  • 2017年07月12日 10:38
  • 144

【DP|多重背包】POJ-1276 Cash Machine

Cash Machine Time Limit: 1000MS   Memory Limit: 10000K       Description A Bank plans to ...

POJ-1276 Cash Machine(经典多重背包)

Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver ap...

POJ 1276 Cash Machine (多重背包&单调队列)

http://poj.org/problem?id=1276 模板题。 完整代码: /*110ms,4316KB*/ #include #include const int mx = 100...

POJ1276-Cash Machine .

转载请注明出处:優YoU  http://user.qzone.qq.com/289065406/blog/1299341477   提示:动态规划,多重背包   题目大意: 有各种不同...
  • a305657
  • a305657
  • 2013年03月12日 21:16
  • 444

POJ 1276 Cash Machine(?)

Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 34902   Accepted: 12...

POJ1276:Cash Machine(多重背包)

Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver a...

POJ 1276 Cash Machine 背包

POJ1276-Cash Machine 分类: POJ解题报告 2011-07-31 11:41 2674人阅读 评论(3) 收藏 举报 优化deleteoutputi...
  • hyccfy
  • hyccfy
  • 2014年07月17日 10:04
  • 248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1276 Cash Machine
举报原因:
原因补充:

(最多只允许输入30个字)