题意就是:给你一定的空间,一定种类的硬币,每种硬币可以重复使用多次,让我们计算消耗这么多的空间的最小质量
dp[i+1][j]表示的就是从前i种硬币中挑选质量小于j的最小价值
转移方程:
dp[i+1][j] = min(dp[i][j],dp[i+1][j-w[i]]+v[i])//选取第i个
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX_N 505
#define MAX_W 10005
#define INF 100000000
using namespace std;
//dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值
int dp[MAX_N][MAX_W];
int n;
int W;
int v[MAX_N];
int w[MAX_N];
int t,k;
int main()
{
//freopen("完全背包A.txt", "r",stdin);
scanf("%d",&t);
k=t;
while(t--)
{
int E,F;
E=F=0;
scanf("%d %d",&E,&F);
W=F-E;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",v+i,w+i);
}
void solve();
solve();
}
}
void solve()
{
//dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值
for(int i=0;i<n;i++)
{
for(int j=0;j<=W;j++)
{
dp[i][j]=INF;
}
}
//dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值
//初值设置***** 将dp[0][0]设为0;
dp[0][0]=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<=W;j++)
{
if(j<w[i])
{
dp[i+1][j]=dp[i][j];
}
else{
dp[i+1][j]=min(dp[i][j],dp[i+1][j-w[i]]+v[i]);
}
}
}
if(dp[n][W]!=INF)
{
cout<<"The minimum amount of money in the piggy-bank is "<<dp[n][W]<<"."<<endl;
}
else{
cout<<"This is impossible."<<endl;
}
}
622

被折叠的 条评论
为什么被折叠?



