刷题——Dollar Dayz POJ - 3181
/*
n元钱在一个有1-k元的店里买东西,每样东西都是无限的,问有多少种购买方法
dp[i][j]表示i元钱买1-j东西的方法数,画个图很容易发现:
dp[i][j]={
dp[i][j]=dp[i-1][j]:i<j
dp[i][j]=dp[i-1][j]+dp[i][j-i]
}
题目数据比较大,n=1000,k=100时答案有30多位转换成大数求解
*/
#include <stdio.h>
#include <string.h>
#define ll long long
char dp[105][1005][50];
int sz(char c){
if(c)return c-'0';
return 0;
}
int main(){
int n,k;
while(~scanf("%d %d",&n,&k)){
memset(dp,0,sizeof(dp));
for(int i=0;i<=k;i++){
dp[i][0][0]='1';
}
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
if(j>=i){
int jw=0;
for(int d=0;dp[i-1][j][d]||dp[i][j-i][d];d++)
{
int a=sz(dp[i-1][j][d]),b=sz(dp[i][j-i][d]);
int temp=(a+b+jw)/10;
dp[i][j][d]=(a+b+jw)%10+'0';
jw=temp;
}
if(jw){
dp[i][j][strlen(dp[i][j])]=jw+'0';
}
}
else{
for(int d=0;dp[i-1][j][d];d++)
dp[i][j][d]=dp[i-1][j][d];
}
}
}
for(int i=strlen(dp[k][n])-1;i>=0;i--){
printf("%c",dp[k][n][i]);
}
printf("\n");
}
return 0;
}
n元钱在一个有1-k元的店里买东西,每样东西都是无限的,问有多少种购买方法
dp[i][j]表示i元钱买1-j东西的方法数,画个图很容易发现:
dp[i][j]={
dp[i][j]=dp[i-1][j]:i<j
dp[i][j]=dp[i-1][j]+dp[i][j-i]
}
题目数据比较大,n=1000,k=100时答案有30多位转换成大数求解
*/
#include <stdio.h>
#include <string.h>
#define ll long long
char dp[105][1005][50];
int sz(char c){
if(c)return c-'0';
return 0;
}
int main(){
int n,k;
while(~scanf("%d %d",&n,&k)){
memset(dp,0,sizeof(dp));
for(int i=0;i<=k;i++){
dp[i][0][0]='1';
}
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
if(j>=i){
int jw=0;
for(int d=0;dp[i-1][j][d]||dp[i][j-i][d];d++)
{
int a=sz(dp[i-1][j][d]),b=sz(dp[i][j-i][d]);
int temp=(a+b+jw)/10;
dp[i][j][d]=(a+b+jw)%10+'0';
jw=temp;
}
if(jw){
dp[i][j][strlen(dp[i][j])]=jw+'0';
}
}
else{
for(int d=0;dp[i-1][j][d];d++)
dp[i][j][d]=dp[i-1][j][d];
}
}
}
for(int i=strlen(dp[k][n])-1;i>=0;i--){
printf("%c",dp[k][n][i]);
}
printf("\n");
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.