poj1742 dp
来源:互联网 发布:变色龙引导u盘安装mac 编辑:程序博客网 时间:2024/05/02 02:48
如题:http://poj.org/problem?id=1742
和之前那一篇hdu2844是一道题,但是这一题的数据量,用O(V*log2(Mi))的多重背包二进制拆分是超时的,为了缩短时间,必须更改dp数组的定义和状态转移方程
定义f[i][j]表示的是前i种硬币用来拼价值j,拼成后第i种硬币剩余的数量。
有j<w[i],代表第i件物品1件都比价值j大,所以第i件物品没法用,f[i][j]=-1
有f[i][j-w[i]]<=0 如果用第i件物品拼成j-w[i]正好拼成(第i件物品正好用完)或者 拼不成(<0),那更不可能拼成价值j的物品
else
f[i]j[=f[i][j-w[i]]-1;
初始化
f全为-1,然后f[0][0]=0; 然后3重for循环从第一件开始推。
注意:上述还需要优化,否则超内存!二维-》一维数组 f[j] j是要拼的价值 然后i,j从小到大循环,保证这一层可以用上一层的值推出。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define max(a,b)(a>b?a:b)
int w[103];
int num[103];
int f[100005];
int n,m;
int main()
{
while(~scanf("%d%d",&n,&m)&&n&&m)
{
int i,j;
memset(f,-1,sizeof(f));
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
f[0]=0;
for(i=1;i<=n;i++)
for(j=0;j<=m;j++)
{
if(f[j]>=0)
f[j]=num[i];
else if(j<w[i]||f[j-w[i]]<0)
f[j]=-1;
else
f[j]=f[j-w[i]]-1;
}
int sum=0;
for(i=1;i<=m;i++)
if(f[i]>=0)
sum++;
printf("%d\n",sum);
}
}
- poj1742 dp
- POJ1742 Coins DP
- [POJ1742 Coins]DP
- poj1742(多重背包dp)
- poj1742
- POJ1742
- poj1742
- poj1742
- poj1742
- POJ1742.Coins(背包DP && 男人八题)
- 多重部分和(DP):POJ1742--Coins
- POJ1742 (dp 多重部分和问题)
- poj1742(dp优化递推关系式)
- poj1742 - Coins
- poj1742 Coins
- POJ1742--Coins
- POJ1742 coins
- POJ1742---Coins
- 重构笔记——将类内联化
- 热门智力题 过桥问题和倒水问题
- 十天学Linux内核之第七天---电源开和关时都发生了什么
- 树的非递归深度优先遍历
- 2015年1月26日 星期一 [iOS]UIwebview左右滑動回上一頁
- poj1742 dp
- CoreText 使用教程:以创建一个简单的杂志应用为例
- 二叉树的建立与遍历-数组模拟和链表模拟
- HttpClient get和HttpClient Post请求的方式获取服务器的返回数据
- CFNetwork概念(CFNetwork Concepts )
- 开始学习C语言了
- javascript 运动函数
- ARM + OpenCV 抓取摄像头图像 && 一点感想
- Java JDK的环境变量配置