Piggy-Bank HDU - 1114 動態規劃
阿新 • • 發佈:2018-12-23
題是完全揹包
但是是要求最小值的
要把除了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;
}