#include <stdio.h>
#include <algorithm>
#define INF 0x7fffffff
using namespace std;
struct money{
int w;//重量
int v;//价值
}mon[501];
int dp[10001];//状态数组 -到该位的价值量
int main(){
int cas;
scanf("%d",&cas);
while(cas--!=0){
int n;//钱币种类
int be,af;//得到空罐和装后的重量
scanf("%d%d",&be,&af);
int res=af-be;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&mon[i].w,&mon[i].v);
for(int i=1;i<=res;i++)
dp[i]=INF;
dp[0]=0;//初始除了0其余状态均为无穷(或不存在)
for(int i=1;i<=n;i++)
for(int j=mon[i].w;j<=res;j++)
if(dp[j-mon[i].w]!=INF)//若 其不为无穷,意味着可由此状态转化而来
dp[j]=min(dp[j],dp[j-mon[i].w]+mon[i].v);
if(dp[res]!=INF) printf("%d\n\n",dp[res]);
else printf("impossible\n");
}
return 0;
}
问题
- 除了0位置为什么其他的都是无穷INF?
- 为什么说dp[j-mon[i].w]!=INF就可以说明可以从该状态转化而来?
3
10 110
2
1 1
30 50
10 110
2
1 1
50 30
1 6
2
10 3
20 4