题意:
给你空钱袋的质量和装满钱的钱袋的质量。
给你先行的n种货币的面值和质量。
问钱包里的钱最少是多少。
如果质量不可行,输出impossible。
思路:
完全背包。
屌丝有个地方没想通,就是如何确定是否是impossible。
其实一开始先初始化成inf,然后只要可行的点都会更新dp数组。所以最后如果仍是inf那么代表这个质量不可行。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int w[600],p[600]; const int inf=0x3f3f3f3f; int dp[10005]; int main() { int t,n,tar; scanf("%d",&t); for(int tt=1;tt<=t;tt++) { int a,b,minn=inf; scanf("%d%d%d",&a,&b,&n); for(int i=1;i<=n;i++) { scanf("%d%d",&p[i],&w[i]); minn=min(minn,w[i]); } tar=b-a; for(int i=1;i<=tar;i++) { dp[i]=inf; } if(tar<0) { printf("This is impossible.\n"); continue; } else if(tar==0) { printf("The minimum amount of money in the piggy-bank is 0.\n"); continue; } dp[0]=0; for(int i=1;i<=n;i++) { for(int j=w[i];j<=tar;j++) { dp[j]=min(dp[j-w[i]]+p[i],dp[j]); } } if(dp[tar]==inf) { printf("This is impossible.\n"); } else { printf("The minimum amount of money in the piggy-bank is %d.\n",dp[tar]); } } }
时间: 2024-10-12 23:21:04