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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

selenium IDE ,明明存在元素,却找不到元素 ,报错Element not found

使用 selenium IDE 录制脚本,经常会发生 这样一种错误。 页面上,明明存在这个元素,就是找不到。 其实原理很简单   , 按钮 点击,没有时间延...

Selenium 找不到元素的处理方法

1、 加默认等待时间,全局性,对每个查找元素都适用,最长等待10秒钟 WebDriver wd; wd.manage().timeouts().implicitlyWait(10, TimeUnit...

asp.net导出数据到Excel的三种方法

原文出处:asp.net导出数据到Excel的几种方法(1/3) 、asp.net导出数据到Excel的几种方法(2/3)、asp.net导出数据到Excel的几种方法(3/3)  asp.ne...

北大POJ1276-Cash Machine

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(多重背包)

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

POJ 1276 Cash Machine (DP)

题目类型  DP 题目意思 给出拥有的金钱 k ( 0 其中道路由四个变量 S  D  L T 描述  S 表示起点城市 D 表示终点城市 L 表示路的长度 T 表示经过这条路...

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【多重背包】

题意:有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额. 样例1: 要取735,取款机内有3种钱:4张125的,6张5的,3张35...

POJ 1276 Cash Machine 多重背包

Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31470   Accepted: 11...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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