dp训练计划——完全背包板子题

题目链接:https://vjudge.net/problem/HDU-1114

题目大意:

给你一个罐子的承受重量V,然后给你n种金币,每一种金币有两个属性,价值C[i]和重量W[i],每一种金币有无限个。

然后让你判断是否能用罐子装重量为V的金币,如果能,请输出重量为V时金币的最小价值。

题解:

完全背包模板题,不过要注意初始化问题,在背包九讲里面也都讲了,不懂的自行百度。 

trick:注意数组要开大点,不然会TLE,记住是TLE,具体原因和后台linux系统有关。

代码实现:

#pragma GCC optimize(2)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair
#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
const int N = 1e4+7;
int C[N],W[N];
int dp[N];
int main(){
    int T=read();
    while(T--){
        int e=read(),f=read();
        int V=abs(f-e);
        int n=read();
        rp(i,1,n) C[i]=read(),W[i]=read();
        mst(dp,INF);
        dp[0]=0;
        int cnt=0;
        // rp(i,1,n){
        //     if(W[i]>V) continue;
        //     int flag=0;
        //     rp(j,1,cnt){
        //         if(W[j]>=W[i]&&C[j]<=C[i])
        //             flag=1;
        //     if(flag) continue;
        //     C[++cnt]=C[i];
        //     W[cnt]=W[i]; 
        // }
        rp(i,1,n)
            rp(j,W[i],V)
                dp[j]=min(dp[j-W[i]]+C[i],dp[j]);
        if(dp[V]!=INF) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[V]);
        else printf("This is impossible.\n");
    }
    return 0;
}
/*
1 7
3
3 3
6 6
2 2 
*/  

 

你可能感兴趣的:(dp)