您的位置:首页 > Web前端

POJ 3260The Fewest Coins (DP)

2012-08-29 21:15 148 查看
题意:FJ 买一个T元的东西,求总钱张数最小值。即付出的张数,加找回的张数的和的值最小。。

这题真纠结啊。。。思路一开始是对的。。。但是初始化为-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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: