题意: 给你一些coin, 每个coin有2个value x 和 y, 题目要求给你一个s,使得sum(xi)^2+sum(yi)^2 = s^2 的coin最小值
状态: dp[i][j] 表示 sumx 到达i, sumy 到达j时候所需要的coin最小值
状态转移:dp[i][j] = min(dp[i][j], dp[i-v[k]][j-v[k]]+1)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define STATUS 2
#define TAG 0
#define MAXN 101
#define MAXV 301
#define INF 0x3f3f3f3f
int dp[MAXV][MAXV], val[MAXN][STATUS];
int dynamic_pro(const int &n, const int &tar)
{
int rst(INF);
memset(dp, 0x3F, sizeof(dp)); dp[0][0] = 0;
for(int i = 0; i < n; i ++) {
for(int k = val[i][TAG]; k < MAXV; k ++) {
for(int z = val[i][!TAG]; z < MAXV; z ++) {
int &flag = dp[k-val[i][TAG]][z-val[i][!TAG]];
if( (INF != flag) && dp[k][z] > flag+1 ) {
dp[k][z] = flag+1;
}
if( k*k+z*z == tar ) {
rst = min(rst, dp[k][z]);
}
}
}
}
return (INF == rst)? -1 : rst;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int cas, m, s, rst;
scanf("%d", &cas);
for(; cas; cas --) {
scanf("%d %d", &m, &s);
for(int i = 0; i < m; i ++) {
scanf("%d %d", &val[i][TAG], &val[i][!TAG]);
}
if( -1 == (rst = dynamic_pro(m, s*s)) ) {
printf("not possible\n"); continue;
}
printf("%d\n", rst);
}
return 0;
}
uva_10306 - e-Coins (二维背包)
最新推荐文章于 2020-02-20 23:26:15 发布