XTU-OJ-1436-礼物-笔记
2023-12-30 16:29:57
参考博客
题意
输入两个数字,第一个数字是商品数量,第二个数字是有的钱数,然后输入商品的价格,开心度和不开心度,买下某件商品,加上开心度,不买某件商品,减去开心度
数据范围
商品数量在16以内,钱数在1000以内,两个数字同时为0表示输入结束
价格在200以内
开心度和不开心度都在50以内
输入
3 100
30 10 5
80 20 16
60 15 7
3 100
30 10 5
70 20 16
60 15 6
0 0
输出
9
24
代码
#include<stdio.h>
#include<string.h>
#define N 20
int a[N],b[N],c[N];
int dp[N][1010];
int maxx(int a,int b)
{
int ans=0;
if(a>b) ans=a;
else ans=b;
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
{
break;
}
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(j<a[i]) dp[i][j]=dp[i-1][j]-c[i];
else dp[i][j]=maxx(dp[i-1][j-a[i]]+b[i],dp[i-1][j]-c[i]);
}
}
int ans=-1e9;
for(int i=0;i<=m;i++)
{
ans=maxx(ans,dp[n][i]);
}
printf("%d\n",ans);
memset(dp,0,sizeof dp);
memset(a,0,sizeof a);
memset(b,0,sizeof b);
memset(c,0,sizeof c);
}
return 0;
}
想法
用 const c语言编译错误
然后是这个是枚举专题里面的,为啥用的是dp来求解
虽然是简单的dp,但是我还是不会写,属于01背包问题,到底怎么才能会写呢?
枚举出来好像也不难,可能还是得慢慢来吧……
答案的最小值取0还会WA,这是为啥,啥都买不起答案会为负数
枚举商品件数,枚举价格(类似于背包的容积),然后建立状态转移方程,第一维表示的是商品数目,第二维表示的是价格,dp的数值表示的是开心度的大小,最后要求的是最大的开心度
表示购买该件商品就把价格减去,然后加上开心度,不购买的话就把价格不变,减去不开心度
文章来源:https://blog.csdn.net/L3102250566/article/details/135305520
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!