POJ 3260The Fewest Coins (DP)
2012-08-29 21:15
148 查看
题意:FJ 买一个T元的东西,求总钱张数最小值。即付出的张数,加找回的张数的和的值最小。。
这题真纠结啊。。。思路一开始是对的。。。但是初始化为-1 怎么交都错,,,,郁闷死了。。
这题真纠结啊。。。思路一开始是对的。。。但是初始化为-1 怎么交都错,,,,郁闷死了。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; const int M = 10001; const int N = 109; const int INF = 0x3f3f3f3f; int n,m; int val ; int c ; int dp[M],rdp[M]; bool init() { if(scanf("%d%d",&n,&m)==EOF) return false; for(int i=0;i<n;i++)scanf("%d",&val[i]); for(int i=0;i<n;i++)scanf("%d",&c[i]); return true; } void solve() { memset(dp,INF,sizeof(dp)); memset(rdp,INF,sizeof(rdp)); dp[0] = 0; for(int i=0;i<n;i++) { for(int t =1;t<c[i];c[i]-=t,t<<=1) { int add = t*val[i]; for(int j=M-1;j>=add;j--) { dp[j]=min(dp[j-add]+t,dp[j]); } } int add = c[i]*val[i]; for(int j=M-1;j>=add;j--) { dp[j]=min(dp[j-add]+c[i],dp[j]); } } rdp[0] = 0; for(int i=0;i<n;i++) for(int j=val[i];j<M;j++) { rdp[j] = min(rdp[j],rdp[j-val[i]]+1); } int ans= INF; for(int i=m;i<M;i++) if(dp[i]!=INF&&rdp[i-m]!=INF) { ans = min(ans,dp[i]+rdp[i-m]); } if(ans ==INF) printf("-1\n"); else printf("%d\n",ans); } int main() { freopen("in.txt","r",stdin); while(init()) solve(); return 0; }
相关文章推荐
- POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS【DP】
- poj 1179 Polygon(DP)
- poj 1463 树形dp入门
- poj 1018 Communication System(DP)
- Poj 2096 Collecting Bugs (dp求期望)
- poj 1661 Help Jimmy(dp)
- POJ 1625 Censored!(AC自动机+高精度+dp)
- Poj 1185 炮兵阵地 【状态压缩dp】
- POJ 3186 Treats for the Cows 简单dp
- POJ 2342 Anniversary party (听说这是树形DP)
- POJ 1157 LITTLE SHOP OF FLOWERS(坐标类DP)
- poj 1185 炮兵阵地 状态压缩dp
- poj 2096 概率dp
- poj 2096——基础期望dp
- POJ 3659 Cell Phone Network【最小支配集 dp && 贪心】
- POJ 2184 Cow Exhibition (dp)
- POJ 1141 区间DP
- poj 1160(dp)
- POJ 3411 Paid Roads (最短路 + dp)
- POj 3420 (轮廓线dp)