代码实现:
#include<stdio.h>
#define INF 0xfffffff
int max(int a, int b){
return a > b ? a : b;
}
struct E
{
int w;
int v;
}list[101];
int dp[101][1001];
int main(){
int s, n;
while (scanf("%d%d",&s,&n)!=EOF)
{
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &list[i].w, &list[i].v);
}
for (int i = 0; i <= s; i++)
{
dp[0][i] = 0;
}
for (int i = 1; i <= n; i++)
{
for (int j = s; j >= list[i].w; j--)
{
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - list[i].w] + list[i].v);
}
for (int j = list[i].w-1; j >= 0; j--)
{
dp[i][j] = dp[i - 1][j];
}
}
printf("%d\n", dp[n][s]);
}
return 0;
}
化二维数组为一维:
#include<stdio.h>
#define INF 0xfffffff
int max(int a, int b){
return a > b ? a : b;
}
struct E
{
int w;
int v;
}list[101];
int dp[1001];
int main(){
int s, n;
while (scanf("%d%d", &s, &n) != EOF)
{
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &list[i].w, &list[i].v);
}
for (int i = 0; i <= s; i++)
{
dp[i] = 0;
}
for (int i = 1; i <= n; i++)
{
for (int j = s; j >= list[i].w; j--)
{
dp[j] = max(dp[j], dp[j - list[i].w] + list[i].v);
}
}
printf("%d\n", dp[s]);
}
return 0;
}
存钱罐问题:
#include<stdio.h>
#define INF 0xfffffff
int min(int a, int b){
return a < b ? a : b;
}
struct E{
int w;
int v;
}list[501];
int dp[10001];
int main(){
int T;
scanf("%d", &T);
while (T--){
int s, tmp;
scanf("%d%d", &tmp,&s );
s -= tmp;
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d%d", &list[i].v, &list[i].w);
}
for (int i = 0; i <= s; i++)
{
dp[i] = INF;
}
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
for (int j = list[i].w; j <= s; j++)
{
if (dp[j-list[i].w]!=INF)
{
dp[j] = min(dp[j],dp[j - list[i].w] + list[i].v);
}
}
}
if (dp[s]!=INF)
{
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[s]);
}
else
{
puts("This is impossible.");
}
}
return 0;
}
大米问题:
实现代码:
#include<stdio.h>
struct E
{
int w;
int v;
}list[2001];
int dp[101];
int max(int a, int b){
return a > b ? a : b;
}
int main(){
int T;
scanf("%d", &T);
while (T--)
{
int s, n;
scanf("%d%d", &s, &n);
int cnt = 0;
for (int i = 1; i <= n; i++)
{
int v, w, k;
scanf("%d%d%d", &w, &v, &k);
int c = 1;
while (k-c>0)
{
k -= c;
list[++cnt].w = c*w;
list[cnt].v = c*v;
c *= 2;
}
list[++cnt].w = w*k;
list[cnt].v = v*k;
}
for (int i = 1; i <= s; i++)
{
dp[i] = 0;
}
for (int i = 1; i <= cnt; i++)
{
for (int j = s; j >= list[i].w; j--)
{
dp[j] = max(dp[j], dp[j - list[i].w] + list[i].v);
}
}
printf("%d\n", dp[s]);
}
return 0;
}