1. 程式人生 > >Piggy-Bank HDU - 1114 動態規劃

Piggy-Bank HDU - 1114 動態規劃

題是完全揹包
但是是要求最小值的
要把除了0以外的所有值都初始化為INF
第一次就把dp【rl】初始了

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define INF 0x3f3f3f
using namespace std;
int dp[10005],m[505],w[505];
int main()
{
    int t;
    int e,f,v,rl,n;
    scanf("%d",&t);
    while
(t--) { memset(dp,0,sizeof(dp)); scanf("%d%d",&e,&f); rl=f-e; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&m[i],&w[i]); for(int i=1;i<=rl;i++) dp[i]=INF; for(int i=1;i<=n;i++) for
(int j=w[i];j<=rl;j++) dp[j]=min(dp[j],dp[j-w[i]]+m[i]); if(dp[rl]==INF) printf("This is impossible.\n"); else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[rl]); } return 0; }

為了更好的理解又用二維陣列做了一下。。結果開始各種初始化錯
這裡面需要給所有的dp[i][0]初始化為0
因為在揹包容量為0的時候,只有0才是合法的答案
還有就是完全揹包的轉移方程
後面是i不是i-1 因為用的是已經更新過的陣列來處理資料

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define INF 0x3f3f3f
using namespace std;
int dp[100][10005],m[505],w[505];
int main()
{
    int t;
    int e,f,v,rl,n;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&e,&f);
        rl=f-e;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&m[i],&w[i]);
        for(int i=0;i<=n;i++)
          for(int j=0;j<=rl;j++)
            dp[i][j]=INF;
        for(int i=0;i<=n;i++)
          dp[i][0]=0;
        for(int i=1;i<=n;i++)
                for(int j=w[i];j<=rl;j++){
                dp[i][j]=min(dp[i-1][j],dp[i][j-w[i]]+m[i]);
                }
        if(dp[n][rl]==INF) printf("This is impossible.\n");
            else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[n][rl]);
    }
    return 0;
}